android surfaceview 大小_Android使用SurfaceView实现仿微信视频通话大小视图切换功能...
发布日期:2021-09-13 07:38:14
浏览次数:1
分类:技术文章
本文共 5321 字,大约阅读时间需要 17 分钟。
作者 | maiduoduo 地址 | https://www.jianshu.com/p/5bbc7a563ef7
前言
前一段时间做了一个即时通讯的项目,在项目中遇到很多坑, 有时间一一做个总结,项目消息发送基于XMPP+Tigase, 语言视频通话基于PJSIP+FreeSWITCH,项目UI仿微信。 做到视频通话时,遇到本地视图与远程视图切换, 网上搜了一篇相关的博客: https://blog.csdn.net/xuedaqian123/article/details/77878781 , 根据大神思路写了这个Demo,其中用的是第三直播源可能有点不稳定, 切换过程可能存在黑屏和无响应的情况, 但是用的Pjsip中切换还是很流程的;
布局
xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context="com.demo.surfaceviewdemo.MainActivity"> android:layout_width="match_parent" android:layout_height="match_parent"> android:id="@+id/rl_remote" android:layout_width="match_parent" android:layout_height="wrap_content"> android:id="@+id/surfaceview_remote" android:layout_width="match_parent" android:layout_height="match_parent"/> android:id="@+id/rl_local" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentRight="true"> android:id="@+id/surfaceview_local" android:layout_width="wrap_content" android:layout_height="wrap_content"/> android:id="@+id/ll_call_container" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_gravity="bottom" android:layout_marginBottom="25dp" android:gravity="center_horizontal" android:orientation="horizontal"> android:id="@+id/tv_call_quiet" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_weight="1" android:drawablePadding="10dp" android:drawableTop="@mipmap/chat_video_change_voice_img" android:gravity="center_horizontal" android:text="切到语音聊天" android:textColor="#ffffff" android:textSize="12sp"/> android:id="@+id/tv_handup_call" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_weight="1" android:drawablePadding="10dp" android:drawableTop="@mipmap/chat_video_guaduan_img_normal" android:gravity="center_horizontal" android:text="挂断" android:textColor="#ffffff" android:textSize="12sp"/> android:id="@+id/tv_change_camera" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_weight="1" android:drawablePadding="10dp" android:drawableTop="@mipmap/chat_video_change_camera_img" android:gravity="center_horizontal" android:text="转换摄像头" android:textColor="#ffffff" android:textSize="12sp"/>
代码
为了实现跟微信一样的效果,普通屏幕全屏显示,为了不让视频内容挤到刘海屏中,添加一下代码:
//如果判断有刘海屏不让填充到状态栏 if (DisplayUtil.hasNotchScreen(this)) { getWindow().addFlags( WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON | WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN); } else { getWindow().addFlags( WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON | WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN | WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS); }
大小视图切换代码:
/** * 大小视图切换 (小视图在前面、大视图在后面) * * @param sourcView 之前相对布局大小 * @param beforeview 之前surfaceview * @param detView 之后相对布局大小 * @param afterview 之后surfaceview */ private void zoomOpera(View sourcView, SurfaceView beforeview, View detView, SurfaceView afterview) { RelativeLayout paretview = (RelativeLayout) sourcView.getParent(); paretview.removeView(detView); paretview.removeView(sourcView); //设置远程大视图RelativeLayout 的属性 RelativeLayout.LayoutParams params1 = new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.MATCH_PARENT, RelativeLayout.LayoutParams.MATCH_PARENT); params1.addRule(RelativeLayout.CENTER_IN_PARENT, RelativeLayout.TRUE); beforeview.setZOrderMediaOverlay(true); beforeview.getHolder().setFormat(PixelFormat.TRANSPARENT); sourcView.setLayoutParams(params1); //设置本地小视图RelativeLayout 的属性 params1 = new RelativeLayout.LayoutParams(defaultLocalwidth, defaultLocalHeight); params1.addRule(RelativeLayout.ALIGN_PARENT_RIGHT, RelativeLayout.TRUE); params1.setMargins(0, defaultLocalMargin, defaultLocalMargin, 0); //在调用setZOrderOnTop(true)之后调用了setZOrderMediaOverlay(true) 遮挡问题 afterview.setZOrderOnTop(true); afterview.setZOrderMediaOverlay(true); afterview.getHolder().setFormat(PixelFormat.TRANSPARENT); detView.setLayoutParams(params1); paretview.addView(sourcView); paretview.addView(detView); }Github地址: https://github.com/androidneter/SurfaceViewDemo 到这里就结束啦 往期精彩回顾:
Android实现短信验证码自动填充功能
Android仿echo精美弹幕功能
Android实现头像重叠排列功能
Android仿QQ个性标签功能
Android仿QQ侧滑删除的功能
转载地址:https://blog.csdn.net/weixin_39785600/article/details/111253243 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!
发表评论
最新留言
路过按个爪印,很不错,赞一个!
[***.219.124.196]2024年03月23日 10时36分30秒
关于作者
喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
华为100万部鸿蒙,2019年Q4发布 华为100万部鸿蒙OS手机已开测
2019-04-21
编程之类的文案_如何锻炼写文案的能力?
2019-04-21
vscode 不能使用中文输入法_vscode中vim插件设置
2019-04-21
当集合a为空集时a的取值范围_1.1.2 集合间的基本关系
2019-04-21
vue 可合并表格组件_Vue实战046:详解Mixins混入使用和注意事项
2019-04-21
python包怎么做双重差分did分析_多变量相关性分析(一个因变量与多个自变量)
2019-04-21
fi sap 凭证冲销 稅_SAP中的成本要素
2019-04-21
mysql幻读是什么意思_MySQL中的幻读,你真的理解吗?
2019-04-21
易语言执行mysql命令_易语言通过“打开”命令操作数据库
2019-04-21
mysql slave 1062_mysql主从同步slave错误1062
2019-04-21
2008日志清理 server sql_SQL Server 2008 清除日志
2019-04-21
mac mysql root 权限_Mac平台重新设置MySQL的root密码
2019-04-21
mysql新增一列_MySQL-ProxySQL中间件
2019-04-21
mysql 30入门_30分钟带你快速入门MySQL教程
2019-04-21