使用VideoView可以为Android设置比例因子吗?默认情况下,视频视图会自行调整大小以适应视频的编码分辨率。我可以强制Android将视频渲染为更小或更大的矩形吗?
答案 0 :(得分:56)
(我知道这是一个非常古老的问题,但还有另一种控制尺寸的方法,这里没有描述,也许有人会发现它有用。)
在布局中声明自己的 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);
}
}
答案 1 :(得分:10)
我发现当VideoView放在RelativeLayout中时,视频会拉伸 高度和宽度,以适应VideoView指定的高度和宽度(无论视频方面如何)比)。但是,当我将VideoView放在FrameLayout中时,视频会拉伸高度和宽度,直到它匹配 之一的VideoView指定的高度或宽度(即它不会打破宽高比) )。奇怪,我知道,但这就是我找到的!
答案 2 :(得分:10)
要为"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);
}
}
答案 3 :(得分:9)
默认情况下,视频视图会调整大小 本身适合编码的分辨率 视频。
VideoView
(或SurfaceView
用于MediaPlayer
)将是您在布局中告诉它的大小。 在该空间内,视频将在保持宽高比的同时尽可能大地播放。
我可以强制Android渲染视频吗? 进入一个更小或更大的矩形?
是的:让您的VideoView
达到您想要的尺寸,Android会缩放到适合VideoView
的尺寸。
答案 4 :(得分:3)
我也在努力实现这一点,到目前为止,这已经成功了。我们的想法是使用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();
答案 5 :(得分:2)
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);
}
答案 6 :(得分:0)
伙计我有其他想法通过扩展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类中的这些方法然后将它用作xro和类文件中的androids默认videoview。
希望它有所帮助。