|
剧情铺垫首先申明,我是一个Android初学者。最开始我们想做一个视频通话软件,很快就找到了AnyChat。但当时用的是官网的demo,只支持横屏。我们想做成下面这个效果:
横屏
竖屏
遇到的问题
1、自己的视频会被对方的视频挡住
2、自己的视频横竖比例不对
3、自己的视频将音量条挡住
4、自己的视频不能居中
问题1的处理
尝试1:由于较熟悉web方面的知识,最先想到用z-index控制View的叠放,结果悲剧的没找到z-index类似物
尝试2:Android中,xml排在后的会覆盖排在前的,但这么做不起作用
尝试3:SurfaceView是一种特殊的View,默认下会显示在普通View后,通过 myView.setZOrderOnTop(true); 可设置SurfaceView到顶层
问题解决!
问题2的处理
这个相对简单,直接贴代码:
private void adjuestVideoSize(int width, int height, Configuration config) {
ConfigEntity configEntity = ConfigService.LoadConfig(this);
float rWidth = configEntity.resolution_width;
float rHeight = configEntity.resolution_height;
if(config.orientation == Configuration.ORIENTATION_PORTRAIT) {
rWidth = configEntity.resolution_height;
rHeight = configEntity.resolution_width;
}
if (rHeight * width > rWidth * height) {
dwLocalVideoHeight = height;
dwLocalVideoWidth = (int)(rWidth / rHeight * dwLocalVideoHeight);
} else {
dwLocalVideoWidth = width;
dwLocalVideoHeight = (int)(rHeight / rWidth * dwLocalVideoWidth);
}
FrameLayout.LayoutParams layoutParamSelf=new FrameLayout.LayoutParams(dwLocalVideoWidth, dwLocalVideoHeight);
myView.setLayoutParams(layoutParamSelf);
}
Android设备配置信息都放在ConfigEntity这个类中,包括摄像头的分辨率
问题3的处理
处理完第一个问题后,音量条被SurfaceView挡住了,这是由于UI布局的问题
只要设置SurfaceView外的FrameLayout
android:layout_height="0dip"
android:layout_weight=“1"
说明:weight指的是剩余空间的权重,所以FrameLayout的高度是0+剩余部分的100%,就不会覆盖音量条的部分
问题4的处理
SurfaceView外部的FrameLayout设置属性:android:layout_gravity="center"
但每次都是左上角对齐
实际是在执行下面这句时改变了对齐方式
FrameLayout.LayoutParams layoutParamSelf=new FrameLayout.LayoutParams(dwLocalVideoWidth, dwLocalVideoHeight);
加个参数就OK了,Gravity.CENTER
FrameLayout.LayoutParams layoutParamSelf=new FrameLayout.LayoutParams(dwLocalVideoWidth, dwLocalVideoHeight, Gravity.CENTER);
鸣谢
最后感谢AnyChat的开发人员,在我处理问题的过程中帮了很大的忙
|
|