是否支持Android缩放视频?
-
20-09-2019 - |
题
使用VideoView是能够设定为Android比例因子?默认情况下,视频视图调整自身大小以适合视频的编码分辨率。我可以强制的Android来呈现视频到一个较小的或较大的矩形?
解决方案
默认视频视图调整大小 本身以适应编码分辨率 的视频。
VideoView
(或与SurfaceView
使用MediaPlayer
)将是你告诉它在你的布局规模。 在这一空间中,视频将回放尽可能大,同时保持高宽比。
我可以强制的Android渲染视频 成更小或更大的rect?
是:让你的VideoView
是你想要的大小,而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置于RelativeLayout的内部中,视频段的 两个 强>的高度和宽度,以适应VideoView的指定的高度和宽度(而不管可视方面的比)。然而,当我放置VideoView在的FrameLayout,视频延伸的高度和宽度,直到它的 之一 强>的VideoView的规定的高度或宽度(即,它不会破坏纵横比相匹配)。奇怪了,我知道,但是这是我的发现!
要设置"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);
}
}
我也想做到这一点,到目前为止这工作确定。我们的想法是使用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 强>答案。
如果没有布局()方法中的 “的 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,用u可以做ü什么都想要创建自己的VideoView类,.正是u必须在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);
}
让自己的构造函数UR VideoView类,并确保该方法在乌拉圭回合自己videoview类,然后把它作为像机器人默认videoview成XML和类文件。
希望它能帮助。