سؤال

باستخدام VideoView هل من الممكن تعيين عامل مقياس لنظام Android؟ بشكل افتراضي ، فإن عرض الفيديو يقيم نفسه لتناسب الدقة المشفرة للفيديو. هل يمكنني إجبار Android على تقديم مقطع فيديو إلى مستقيم أصغر أو أكبر؟

هل كانت مفيدة؟

المحلول

بشكل افتراضي ، فإن عرض الفيديو يقيم نفسه لتناسب الدقة المشفرة للفيديو.

VideoView (أو ال SurfaceView للاستعمال مع MediaPlayer) سيكون الحجم الذي تقوله ليكون في تخطيطك. داخل هذا الفضاء, ، سوف يتم تشغيل الفيديو بأكبر قدر ممكن مع الحفاظ على نسبة العرض إلى الارتفاع.

هل يمكنني إجبار Android على تقديم مقطع فيديو إلى مستقيم أصغر أو أكبر؟

نعم: اجعل VideoView يكون الحجم الذي تريده ، وسيقوم Android بتوسيع حجمه لتناسب حجم VideoView.

نصائح أخرى

(أعلم أنه سؤال قديم للغاية ، ولكن هناك طريقة أخرى للتحكم في الأبعاد ، التي لم يتم وصفها هنا ، ربما سيجدها شخص ما مفيدًا.)

أعلن بنفسك MyVideoview الفصل في التصميم الخاص بك واكتب بنفسك onMeasure () طريقة. فيما يلي كيفية تشغيل الفيديو الممتد إلى أبعاد View Original:


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);
 }
}

أجد أنه عندما يتم وضع VideoView داخل relativelayout ، يمتد الفيديو على حد سواء الارتفاع والعرض لتناسب ارتفاع وعرض VideoView (بغض النظر عن نسبة عرض الفيديو). ومع ذلك ، عندما أضع VideoView في FrameLayout ، يمتد الفيديو الارتفاع والعرض حتى يتطابق واحد من ارتفاع أو عرض VideoView المحدد (أي أنه لا يكسر نسبة العرض إلى الارتفاع). غريب ، أعرف ، لكن هذا ما وجدته!

لتعيين "centerCrop" نوع النطاق ل VideoView لك onMeasure() و layout() قد تبدو الأساليب هكذا:


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);
    }
}

أحاول أيضًا تحقيق ذلك ، وقد نجح هذا جيدًا حتى الآن. تتمثل الفكرة في استخدام SetLayoutParams لعرض الفيديو وتحديد الحجم. إنها مجرد جزء بسيط ولكنه يعطي الفكرة. تحقق من خطوط LayoutParams.

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();

ل Feelgoods إجابه.

بدون طريقة التصميم ()CenterCrop " نوع المقياس أفضل ، ولكن يجب أن يكون VideoView في FrameLayout.

@Override
public void layout(int l, int t, int r, int b) {
    super.layout(l + leftAdjustment, t + topAdjustment, r + leftAdjustment, b + topAdjustment);
}

يا رفاق ، كان لدي فكرة أخرى ، قم بإنشاء فئة VideoView الخاصة بك عن طريق توسيع VideoView ، مع أنه يمكنك فعل ما تريده ،. بالضبط عليك إنشاء طريقين في 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 الافتراضي في Androids في كل من ملفات XML و Class.

أتمنى أن يساعد ذلك.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top