基于VideoView开发切换视频缩放比例:1:1, 满屏, 16:9, 4:3等。
首先需要继承VideoView写一个新类,这里我们就把这个类叫做TestVideoView。
在TestVideoView这个类中重写onMeasure()
这个方法,这个方法是处理view大小的关键。
代码如下(完整):
具体做法见代码注释
public class TestVideoView extends VideoView {
//常量 在这里定义你需要的比例
public static final String FULL_SCREEN = "full_screen";
public static final String SIXTEEN_TO_NINE = "16:9";
public static final String FOUR_TO_THREE = "4:3";
public static final String ORIGIN_VIEW = "1:1";
//变量 我这里写的默认比例1:1
private String mRatio = ORIGIN_VIEW;
//重写onMeasure方法
//setMeasuredDimension(),切换view的大小
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
switch (mRatio){
//满屏 获取设备的宽高直接设置
case FULL_SCREEN:
int screenWidth = getScreenRatio()[0];
int screenHigh = getScreenRatio()[1];
setMeasuredDimension(screenWidth, screenHigh);
break;
//16:9
case SIXTEEN_TO_NINE:
Integer[] SixteenToNine = getVideoRatio(16, 9);
setMeasuredDimension(SixteenToNine[0], SixteenToNine[1]);
break;
//4:3
case FOUR_TO_THREE:
Integer[] FourToThree = getVideoRatio(4, 3);
setMeasuredDimension(FourToThree[0], FourToThree[1]);
break;
//..别的比例可以自定义
//默认视频原大小
default:
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
break;
}
}
//fragment传入当前选择的比例
public void setScreenRatio(String ratio) {
this.mRatio = ratio;
requestLayout();
}
//根据传入比例换算view显示的大小 无论显示什么样的比例大小,视频的宽高有一边都需要贴边
private Integer[] getVideoRatio(double width, double height) {
int screenWidth = getScreenRatio()[0];
int screenHigh = getScreenRatio()[1];
// 计算要设置的视频宽度和高度
int videoWidth = (int) (screenHigh * width / height);
int videoHeight = screenHigh;
// 如果视频宽度超过屏幕宽度,则调整
if (videoWidth > screenWidth) {
videoHeight = (int) (screenWidth * height / width);
videoWidth = screenWidth;
}
return new Integer[] {videoWidth, videoHeight};
}
//获取当前设备屏幕宽高 返回的是数组
private Integer[] getScreenRatio(){
DisplayMetrics dm = getResources().getDisplayMetrics();
int screenWidth = dm.widthPixels;
int screenHigh = dm.heightPixels;
return new Integer[] {screenWidth, screenHigh};
}
}
总结
参考地址:Android获取屏幕分辨率的三种方法
以上就是如何使用重写onMeasure()
来实现videoView
显示范围的代码。