我知道如何拉伸ViewVideo以适应屏幕。 但MX Player允许更大的视频。 视频几乎比屏幕大。 所以观众会看到视频的裁剪部分。
Android的VideoView可以制作这样的技巧吗?
答案 0 :(得分:2)
我认为你不能只用常规的VideoView
来做这件事......虽然我能用更复杂的方法做到这一点。
TLDR:您需要创建一个与VideoView类似的自定义视图,但它基于TextureView而不是SurfaceView,并为此视图设置正确的变换矩阵。
TLDR编辑:请先查看我的回答编辑,因为您实际上可以使用VideoView进行此操作...
创建此视图有点棘手,主要是因为MediaPlayer
事件可以在不同的设备上以不同的顺序触发,也可以播放不同的视频。
基本理念是:
View
TextureView
MediaPlayer
对象来管理整个播放视频的内容......例如视图的字段TextureListener
setSurfaceTextureListener()
TextureListener
个方法内部(onSurfaceTextureAvailable(SurfaceTexture surfaceTexture, int width, int height)
内部更具体)创建一个带有构造函数的新Surface
:的
Surface surface = new Surface(surfaceTexture);
MediaPlayer
的表面,其中包含:的
mMediaPlayer.setSurface(surface);
这个变换矩阵的创建可能看起来像这样(示例来自我的旧代码,如果我没记错的话,将视频拟合到视图的高度和裁剪剩下的所有东西):
float scaleY = 1.0f;
float scaleX = (mVideoWidth * mViewHeight / mVideoHeight) / mViewWidth;
int pivotPointX = (int) (mViewWidth / 2);
int pivotPointY = (int) (mViewHeight / 2);
Matrix matrix = new Matrix();
matrix.setScale(scaleX, scaleY, pivotPointX, pivotPointY);
setTransform(matrix);
编辑:
嗯......当我再次考虑它时,也许你只能通过常规VideoView
来实现这一点。只需按照与scaleX
,scaleY
,pivotPointX
和pivotPointY
计算相似的方法,并为SurfaceView
的基础VideoView
设置这些值使用方法setScaleX()
,setScaleY()
,setPivotX()
和setPivotY()
,看看它是否有效。如果您测试它,请告诉我它是否有效。