使用 VideoView 是否可以为 Android 设置比例因子?默认情况下,视频视图会自行调整大小以适应视频的编码分辨率。我可以强制 Android 将视频渲染成更小或更大的矩形吗?
7 回答
(我知道这是一个非常老的问题,但是还有另一种控制尺寸的方法,这里没有描述,也许有人会觉得它有帮助。)
在布局中声明您自己的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);
}
}
为您的和方法设置"centerCrop"
比例类型可能如下所示:VideoView
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 中时,视频会拉伸高度和宽度以适应 VideoView 的指定高度和宽度(无论视频纵横比如何)。但是,当我将 VideoView 放在 FrameLayout 中时,视频会拉伸高度和宽度,直到它与VideoView 的指定高度或宽度之一匹配(即它不会破坏纵横比)。奇怪,我知道,但这就是我发现的!
默认情况下,视频视图会自行调整大小以适应视频的编码分辨率。
VideoView
(或SurfaceView
for use with MediaPlayer
)将是您告诉它在布局中的大小。在该空间内,视频将在保持纵横比的同时尽可能大地播放。
我可以强制 Android 将视频渲染成更小或更大的矩形吗?
是的:让你VideoView
成为你想要的大小,Android 将缩放以适应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);
}
伙计们,我有其他想法通过扩展 VideoView 创建自己的 VideoView 类,这样你就可以做任何你想做的事。正是你必须在你的 VideoView 中创建几个方法。
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 和类文件中。
希望能帮助到你。