Android是否支持缩放video?

使用VideoView可以为Android设置缩放比例吗? 默认情况下,video视图调整自己以适应video的编码分辨率。 我可以强制Android将video渲染为更小或更大的矩形?

Solutions Collecting From Web of "Android是否支持缩放video?"

默认情况下,video视图调整自己以适应video的编码分辨率。

VideoView (或与MediaPlayer一起使用的SurfaceView )的尺寸将与您的布局中的尺寸相同。 在该空间内 ,video将尽可能大的播放,同时保持宽高比。

我可以强制Android将video渲染为更小或更大的矩形?

是的:使您的VideoView成为您想要的大小,并且Android会缩放以适应VideoView的大小。

(我知道这是一个非常古老的问题,但还有另一种方法来控制尺寸,这里没有描述,也许有人会发现它有帮助。)

在布局中声明自己的MyVideoView类并编写自己的onMeasure()方法。 以下是如何将video延伸到原始视图的尺寸:

 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设置"centerCrop"缩放types, 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); } } 

我发现当一个VideoView被放置在一个RelativeLayout中时,video的高度和宽度都会扩展到适合VideoView指定的高度和宽度(与video宽高比无关)。 但是,当我把VideoView放在一个FrameLayout中时,video会扩展高度和宽度,直到它匹配VideoView指定的高度或宽度(即不会破坏宽高比)。 奇怪,我知道,但这就是我发现的!

我也试图达到这一点,迄今为止,这工作确定。 这个想法是为video视图使用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(); 

感觉良好的答案。

如果没有layout()方法,“ centerCrop”缩放types会更好,但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创build自己的VideoView类,你可以做你想做的事情。 正是你必须在你的VideoView中创build几个方法。

 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类创build你自己的构造函数,并确保在你自己的videoview类中的这个方法,然后像androids默认的videoview一样将它用到xml和class文件中。

希望能帮助到你。