如何在 android 中对 VideoView 执行放大/缩小?
Posted
技术标签:
【中文标题】如何在 android 中对 VideoView 执行放大/缩小?【英文标题】:How to perform zoom in/out on VideoView in android? 【发布时间】:2013-12-09 10:26:24 【问题描述】:我正在使用 VideoView 并从资源中运行视频。
我想知道,有什么方法可以对正在播放的视频进行放大/缩小功能吗?
【问题讨论】:
请参考ZoomableTextureView here 对我来说很好用 【参考方案1】:好的,我遇到了这个问题,并通过删除 VideoView 并将其替换为 TextureView 来解决它。然后,您可以应用 Matrix 转换,其中包括许多选项,包括缩放。
我将使用的矩阵方法是postScale()
方法。您可以在前后应用多种效果,您可以在文档中查看。
编辑
这是我们使用的正在运行的项目中的自定义 VideoView。您可以在 XML 布局中对它进行 decalre,它有一个名为 setMatrix()
的函数,它接受一个 Matrix 参数。原始代码由 Alex Ross 编写,然后我们对其进行了修改以处理 Matrix 功能。
http://pastebin.com/KwQvBWs1
【讨论】:
以上代码不包含任何缩放手势检测器。它如何在没有比例手势检测器的情况下支持放大/缩小?【参考方案2】:您可以使用此链接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 at android.media.MediaPlayer.getVideoWidth(Native Method)【参考方案3】:使用这个方法
video_player_view.getRotation();
它处于水平模式,视频全屏显示
【讨论】:
【参考方案4】:找到了一个棘手的方法来实现所有视频播放器应用程序(mx player、vlc)使用的相同缩放方法
您可以在屏幕宽度和高度的基础上更改 Videoview 布局参数。
zoom++;
if (zoom == 1)
videoview1.setLayoutParams(new LinearLayout.LayoutParams(getDisplayWidthPixels(getApplicationContext()) + 500, getDisplayHeightPixels(getApplicationContext()) + 200));
Toast.showMessage(getApplicationContext(), "1");
【讨论】:
以上是关于如何在 android 中对 VideoView 执行放大/缩小?的主要内容,如果未能解决你的问题,请参考以下文章
无法在android的videoview中播放来自url的视频如何在videoview中播放来自URL的视频?
如何在 SplashScreen API android 上使用 VideoView?
如何在 Android 中捕获 VideoView 的屏幕截图或视频帧
如何检测 VideoView 何时开始播放(Android)?