वीडियो व्यू का उपयोग करना एंड्रॉइड के लिए स्केल फैक्टर सेट करना संभव है? डिफ़ॉल्ट रूप से वीडियो दृश्य वीडियो के एन्कोडेड रिज़ॉल्यूशन को फिट करने के लिए स्वयं का आकार बदलता है। क्या मैं एक वीडियो को एक छोटे या बड़े आय में प्रस्तुत करने के लिए एंड्रॉइड को मजबूर कर सकता हूं?एंड्रॉइड समर्थन वीडियो स्केलिंग करता है?
उत्तर
डिफ़ॉल्ट रूप से वीडियो दृश्य ही आकार बदलता है इनकोडिंग संकल्प वीडियो के फिट करने के लिए।
VideoView
(या MediaPlayer
साथ प्रयोग के लिए SurfaceView
) आकार आप इसे बताने के अपने लेआउट में होना होगा। उस स्थान के भीतर, वीडियो पहलू अनुपात को बनाए रखते हुए जितना संभव हो सके उतना बड़ा खेलेंगे।
क्या मैं एंड्रॉइड को एक वीडियो या को एक छोटे या बड़े आय में प्रस्तुत करने के लिए मजबूर कर सकता हूं?
हाँ: बनाने के अपने VideoView
आकार आप चाहते हो, और Android VideoView
के आकार फिट करने के लिए पैमाने पर होगा।
(मैं जानता हूँ कि यह बहुत पुराना सवाल है, लेकिन वहाँ आयाम को नियंत्रित करने का एक और तरीका है, जो यहाँ वर्णित नहीं है, हो सकता है किसी को यह उपयोगी मिल जाएगा।)
अपने लेआउट में अपने स्वयं के MyVideoView वर्ग घोषित और अपना खुद का ऑनमेज़र() विधि लिखें।
public class MyVideoView extends VideoView {
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
int width = getDefaultSize(0, widthMeasureSpec);
int height = getDefaultSize(0, heightMeasureSpec);
setMeasuredDimension(width, height);
}
}
मैं भी है कि प्राप्त करने के लिए कोशिश कर रहा हूँ और अब तक यह ठीक काम किया है: यहाँ कैसे वीडियो मूल देखें के आयामों को बढ़ाया चलाने के लिए है। विचार वीडियो दृश्य के लिए setLayoutParams का उपयोग करना और आकार निर्दिष्ट करना है। यह सिर्फ एक साधारण टुकड़ा है लेकिन यह विचार देता है। लेआउटपार्म लाइनों की जांच करें।
VideoView mVideoView = new VideoView(this);
//intermediate code
mVideoView.setVideoPath("/sdcard/VIDEO0007.3gp");
MediaController mController = new MediaController(this);
mVideoView.setMediaController(mController);
mController.setOnTouchListener(new View.OnTouchListener() {
public boolean onTouch(View v, MotionEvent event) {
int width = mVideoView.getMeasuredWidth();
int height = mVideoView.getMeasuredHeight();
//we add 10 pixels to the current size of the video view every time you touch
//the media controller.
LayoutParams params = new LinearLayout.LayoutParams(width+10, height+10);
mVideoView.setLayoutParams(params);
return true;
}
});
mVideoView.requestFocus();
mVideoView.start();
मुझे लगता है कि जब एक VideoView एक RelativeLayout अंदर रखा जाता है, वीडियो में फैला है दोनों ऊंचाई और चौड़ाई (वीडियो पहलू अनुपात पर ध्यान दिए बिना) VideoView के निर्दिष्ट ऊंचाई और चौड़ाई फिट करने के लिए लगता है। हालांकि, जब मैं फ़्रेमलेआउट में वीडियो व्यू डालता हूं, तो वीडियो वीडियो व्यू की निर्दिष्ट ऊंचाई या चौड़ाई (यानी यह पहलू अनुपात नहीं तोड़ता है) तक वीडियो ऊंचाई और चौड़ाई बढ़ाता है। अजीब, मुझे पता है, लेकिन मुझे यही मिला!
दोस्तों मुझे वीडियो व्यू को विस्तारित करके अपना स्वयं का वीडियो व्यू क्लास बनाना था, जिसके साथ आप जो भी चाहें कर सकते हैं। बिल्कुल आपको अपने वीडियो व्यू में कुछ तरीकों का निर्माण करना होगा।
public void setDimensions(int w, int h) {
this.mForceHeight = h;
this.mForceWidth = w;
}
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
setMeasuredDimension(mForceWidth, mForceHeight);
}
उर VideoView वर्ग के लिए अपने स्वयं के निर्माता बनाने के लिए और यकीन है कि उर खुद videoview कक्षा में इस तरीकों तो दोनों एक्सएमएल और वर्ग फ़ाइलों में एंड्रोइड्स डिफ़ॉल्ट videoview की तरह के रूप में उपयोग कर सकते हैं।
उम्मीद है कि यह मदद करता है।
"centerCrop"
पैमाने प्रकार सेट करने के लिए VideoView
अपने onMeasure()
और layout()
तरीकों के लिए कुछ ऐसा दिखाई देगा: FeelGoods
public class CenterCropVideoView extends VideoView {
private int leftAdjustment;
private int topAdjustment;
...
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
int videoWidth = getMeasuredWidth();
int videoHeight = getMeasuredHeight();
int viewWidth = getDefaultSize(0, widthMeasureSpec);
int viewHeight = getDefaultSize(0, heightMeasureSpec);
leftAdjustment = 0;
topAdjustment = 0;
if (videoWidth == viewWidth) {
int newWidth = (int) ((float) videoWidth/videoHeight * viewHeight);
setMeasuredDimension(newWidth, viewHeight);
leftAdjustment = -(newWidth - viewWidth)/2;
} else {
int newHeight = (int) ((float) videoHeight/videoWidth * viewWidth);
setMeasuredDimension(viewWidth, newHeight);
topAdjustment = -(newHeight - viewHeight)/2;
}
}
@Override
public void layout(int l, int t, int r, int b) {
super.layout(l + leftAdjustment, t + topAdjustment, r + leftAdjustment, b + topAdjustment);
}
}
मुझे वीडियो चलाने की कोशिश कर रहा है, वीडियो व्यू पहले बाईं ओर प्राप्त चौड़ाई समायोजन कर रहा था समायोजन और फिर ऊंचाई को छोड़कर मूल बाएं समायोजन पर सेट किया गया था। मैंने इसे कक्षा निजी int leftAdjustment = 0 में चर के प्रारंभिकरण को हटाने का हल किया; निजी int शीर्ष समायोजन = 0; और को हटाकर समायोजन = 0; शीर्ष समायोजन = 0; विधि के अंदर से समाधान के लिए धन्यवाद, TextureView API 14 का उपयोग किए बिना वीडियो को फसल करने का एक अच्छा तरीका और compatibilty – AntPachon
खोना आपको लेआउट विधि लाइन को 'super.layout (l + leftAdjustment, t + topAdjustment, आर - बाएं समायोजन, बी - शीर्ष समायोजन); ' । अन्यथा यह सिर्फ आपके vidoView को स्थानांतरित करेगा, लेकिन इसका आकार – rstk
नहीं बदलता है मुझे लगता है कि स्केलिंग setMeasuredDimension() पर मेजर() में पहुंच गई है। मैंने उस कोड का इस्तेमाल https://play.google.com/store/apps/details?id=ru.zenrus.android में किया था, और यह काम करता था। क्या आपने अपना सुझाव चेक किया है? – FeelGood
करने के लिए जवाब।
लेआउट() विधि के बिना "सेंटरक्रॉप" स्केल प्रकार बेहतर है, लेकिन वीडियो व्यू फ़्रेमलेआउट में होना चाहिए।
@Override
public void layout(int l, int t, int r, int b) {
super.layout(l + leftAdjustment, t + topAdjustment, r + leftAdjustment, b + topAdjustment);
}
शानदार, क्या आप पहलू अनुपात को तोड़ने के तरीके के बारे में जानते हैं? – haseman
कि मुझे नहीं, क्षमा करें। – CommonsWare
मुझे यह जोड़ना चाहिए कि सभी प्लेटफार्म वास्तव में यह सही तरीके से नहीं करते हैं। उदाहरण के लिए, Droid एरिस वीडियो को इसके मूल रिज़ॉल्यूशन तक स्केल करने लगता है, जैसा कि वीडियो दृश्य को विस्तारित करता है। प्लेटफार्म विखंडन अहो !! – haseman