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); }
a0aada32569d6ee687727699f04f8e05.png
ad6e91739ae2af30b174a611bd4aced4.png
579d44aa1dab026836d7e436c8abaa3e.png Github地址: https://github.com/androidneter/SurfaceViewDemo 到这里就结束啦
往期精彩回顾:
  • Android实现短信验证码自动填充功能

  • Android仿echo精美弹幕功能

  • Android实现头像重叠排列功能

  • Android仿QQ个性标签功能

  • Android仿QQ侧滑删除的功能

e43eb709e1307b677217580f904560c4.png

61ab23fc5a097b3f80805dbda05affb5.png

转载地址:https://blog.csdn.net/weixin_39785600/article/details/111253243 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:java 打印机打印份数_迎新季|图书馆攻略自助打印复印服务
下一篇:html下拉复选框_HTML

发表评论

最新留言

路过按个爪印,很不错,赞一个!
[***.219.124.196]2024年03月23日 10时36分30秒

关于作者

    喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!

推荐文章

华为100万部鸿蒙,2019年Q4发布 华为100万部鸿蒙OS手机已开测 2019-04-21
android+大富翁+局域网,【图片】大富翁6局域网(LAN)多人联机教程(求精)_大富翁吧_百度贴吧... 2019-04-21
rn webview加载本地静态html,React Native - Webview 加载本地文件 2019-04-21
dax powerbi 生成表函数_Power BI |DAX函数のCALCULATETABLE、CALENDAR函数以及相关表生成函数... 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执行计划中性能最差的是_MySQL性能优化(七):MySQL执行计划,真的很重要,来一起学习吧... 2019-04-21
易语言执行mysql命令_易语言通过“打开”命令操作数据库 2019-04-21
mysql slave 1062_mysql主从同步slave错误1062 2019-04-21
mysql构造器_MySQL行构造器表达式优化(Row Constructor Expression) 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
kangle主机怎么配置MySQL_kangle web服务+easypanel主机控制面板快速搭建网站和数据库以及管理空间详细教程... 2019-04-21