在Android中,使用VideoView播放视频,默认情况下视频会按照其编码分辨率来自适应地调整大小。是否可以通过设置缩放因子来强制Android将视频渲染为更小或更大的矩形?
在Android中,使用VideoView播放视频,默认情况下视频会按照其编码分辨率来自适应地调整大小。是否可以通过设置缩放因子来强制Android将视频渲染为更小或更大的矩形?
(我知道这是一个非常古老的问题,但有另一种控制尺寸的方式没有在这里描述,也许会对某些人有所帮助。)
您可以在布局中声明自己的MyVideoView类并编写自己的onMeasure()方法,以控制尺寸。以下是如何将视频拉伸到原始视图的尺寸:
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"
比例类型,则您的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);
}
}
super.layout(l + leftAdjustment, t + topAdjustment, r - leftAdjustment, b - topAdjustment);
。否则,它只会移动你的 vidoView,而不改变它的大小。 - rstkVideoView
只占屏幕的一半,我需要对视频进行缩放裁剪,但是这个解决方案只是最大化了视图,而没有裁剪视频。 - Konstantin KonopkoVideoView
(或与MediaPlayer
一起使用的SurfaceView
)的尺寸将按您设置的大小显示。视频将以最大可能的尺寸播放,同时保持纵横比,在该空间内播放。VideoView
设置为所需的大小,Android将缩放以适合VideoView
的尺寸。我发现当一个VideoView被放置在RelativeLayout中时,视频会拉伸高度和宽度以适应VideoView指定的高度和宽度(而不考虑视频的宽高比)。然而,当我将VideoView放置在FrameLayout中时,视频会拉伸高度和宽度直到匹配VideoView指定的高度或宽度之一(即不破坏宽高比)。很奇怪,但这就是我发现的情况!
我也在尝试实现这个目标,到目前为止这个方法还可以。思路是使用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 的答复。
如果没有 layout() 方法,“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);
}
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类中,然后将其用作Android默认videoview一样在xml和class文件中使用。
希望能帮到您。