如何在Android中对VideoView进行缩放?

8

我正在使用VideoView从资源中运行视频。

我想知道,是否有办法在播放视频时执行缩放功能?


请参考此处的ZoomableTextureView(http://stackoverflow.com/questions/42359407/load-and-play-video-to-textureview-from-an-url)它对我来说运行良好。 - Liya
4个回答

7

好的,我曾遇到这个问题,并通过删除VideoView并将其替换为TextureView来解决它。然后,您可以应用包括缩放在内的Matrix转换。

我使用的Matrix方法是postScale()方法。您可以在文档中查看可以应用于前期和后期的多个效果。

编辑

这是来自运行项目的自定义VideoView。您可以在XML布局中声明它,并且它具有一个名为setMatrix()的函数,该函数接受一个Matrix参数。原始代码由Alex Ross编写,然后我们进行了修改以处理Matrix功能。

http://pastebin.com/KwQvBWs1


4
以上代码中没有包含任何缩放手势检测器。它是如何在没有缩放手势检测器的情况下支持缩放功能的? - Halil

0
找到了一种巧妙的方法来实现所有视频播放应用程序(mx player,vlc)使用的相同缩放方法。
你可以根据屏幕宽度和高度更改Videoview Layout参数。
zoom++;
if (zoom == 1) {
    videoview1.setLayoutParams(new LinearLayout.LayoutParams(getDisplayWidthPixels(getApplicationContext()) + 500, getDisplayHeightPixels(getApplicationContext()) + 200));
    Toast.showMessage(getApplicationContext(), "1");
}

0
请使用这个方法。
video_player_view.getRotation();

它可以在水平模式下获得,并且视频可以全屏显示


0

您可以使用此链接提供的解决方案 https://github.com/father2sisters/scale_videoview

我已更新上述解决方案以处理方向更改。

import android.content.res.Configuration;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.util.DisplayMetrics;
import android.util.Log;
import android.view.GestureDetector;
import android.view.MotionEvent;
import android.view.ScaleGestureDetector;
import android.view.View;
import android.view.ScaleGestureDetector.OnScaleGestureListener;
import android.view.GestureDetector.SimpleOnGestureListener;
import android.widget.FrameLayout;


public class VideoZoomActivity extends AppCompatActivity {

    int MIN_WIDTH;
    private FrameLayout frameLayout;
    private FrameLayout.LayoutParams mRootParam;
    private VodView mVodView;
    private ScaleGestureDetector mScaleGestureDetector;
    private GestureDetector mGestureDetector;
    DisplayMetrics dm;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_video_zoom);

        dm = new DisplayMetrics();
        getWindowManager().getDefaultDisplay().getMetrics(dm);
        MIN_WIDTH = dm.widthPixels;
        Log.d("WIDTH==",MIN_WIDTH+"");
        frameLayout = (FrameLayout)findViewById(R.id.root_view);
        mRootParam = (FrameLayout.LayoutParams)frameLayout.getLayoutParams();
        mVodView = (VodView) findViewById(R.id.vodView1);
        mVodView.setVideoPath("http://clips.vorwaerts-gmbh.de/big_buck_bunny.mp4");

        // set up gesture listeners
        mScaleGestureDetector = new ScaleGestureDetector(this, new MyScaleGestureListener());
        mGestureDetector = new GestureDetector(this, new MySimpleOnGestureListener());
        mVodView.setOnTouchListener(new View.OnTouchListener() {

            @Override
            public boolean onTouch(View v, MotionEvent event) {
                mGestureDetector.onTouchEvent(event);
                mScaleGestureDetector.onTouchEvent(event);
                return true;
            }
        });
    }

    @Override
    public void onConfigurationChanged(Configuration newConfig) {
        super.onConfigurationChanged(newConfig);

        // Checks the orientation of the screen

        getWindowManager().getDefaultDisplay().getMetrics(dm);
        MIN_WIDTH = dm.widthPixels;
        mVodView.setFixedVideoSize(dm.widthPixels,dm.heightPixels);
        mRootParam.width = dm.widthPixels;
        mRootParam.height = dm.heightPixels;


        getWindowManager().getDefaultDisplay().getMetrics(dm);
        MIN_WIDTH = dm.widthPixels;
        mVodView.setFixedVideoSize(dm.widthPixels,dm.heightPixels);
        mRootParam.width = dm.widthPixels;

    }

    @Override
    protected void onResume() {
        mVodView.start();
        super.onResume();
    }

    @Override
    protected void onPause() {
        mVodView.pause();
        super.onPause();
    }

    private class MySimpleOnGestureListener extends SimpleOnGestureListener {

        @Override
        public boolean onSingleTapConfirmed(MotionEvent e) {
            if (mVodView == null)
                return false;
            if (mVodView.isPlaying())
                mVodView.pause();
            else
                mVodView.start();
            return true;
        }
    }

    private class MyScaleGestureListener implements OnScaleGestureListener {
        private int mW, mH;
        @Override
        public boolean onScale(ScaleGestureDetector detector) {
            // scale our video view
            mW *= detector.getScaleFactor();
            mH *= detector.getScaleFactor();
            if (mW < MIN_WIDTH) { // limits width
                mW = mVodView.getWidth();
                mH = mVodView.getHeight();
            }
            Log.d("onScale", "scale=" + detector.getScaleFactor() + ", w=" + mW + ", h=" + mH);
            mVodView.setFixedVideoSize(mW, mH); // important
            mRootParam.width = mW;
            mRootParam.height = mH;
            return true;
        }

        @Override
        public boolean onScaleBegin(ScaleGestureDetector detector) {
            mW = mVodView.getWidth();
            mH = mVodView.getHeight();
            Log.d("onScaleBegin", "scale=" + detector.getScaleFactor() + ", w=" + mW + ", h=" + mH);
            return true;
        }

        @Override
        public void onScaleEnd(ScaleGestureDetector detector) {
            Log.d("onScaleEnd", "scale=" + detector.getScaleFactor() + ", w=" + mW + ", h=" + mH);
        }

    }
}

程序崩溃开始* java.lang.IllegalStateException 在android.media.MediaPlayer.getVideoWidth(本机方法)中 - Ronak Gadhia

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接