【发布时间】:2016-03-19 00:31:48
【问题描述】:
使用 VideoView 是否可以为 Android 设置比例因子?默认情况下,视频视图会自行调整大小以适应视频的编码分辨率。我可以强制 Android 将视频渲染成更小或更大的矩形吗?
【问题讨论】:
标签: android video android-videoview
使用 VideoView 是否可以为 Android 设置比例因子?默认情况下,视频视图会自行调整大小以适应视频的编码分辨率。我可以强制 Android 将视频渲染成更小或更大的矩形吗?
【问题讨论】:
标签: android video android-videoview
(我知道这是一个很老的问题,但是还有另一种控制尺寸的方法,这里没有描述,也许有人会发现它有帮助。)
在你的布局中声明你自己的 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,但不会改变它的大小
VideoView 只占屏幕的一半,我需要缩放视频,但这个解决方案只是最大化视图,而不是裁剪视频
我发现当 VideoView 放置在 RelativeLayout 中时,视频会拉伸高度和宽度以适应 VideoView 的指定高度和宽度(与视频方面无关比率)。但是,当我将 VideoView 放在 FrameLayout 中时,视频会拉伸高度和宽度,直到它与 之一的 VideoView 的指定高度或宽度匹配(即,它不会破坏纵横比)。奇怪,我知道,但这就是我发现的!
【讨论】:
默认情况下,视频视图会调整大小 本身适合编码的分辨率 视频。
VideoView(或与MediaPlayer 一起使用的SurfaceView)将是您告诉它在布局中的大小。 在该空间内,视频将在保持纵横比的同时尽可能大地播放。
我可以强制 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 和类文件中。
希望对你有帮助。
【讨论】: