Android仿微信视频聊天本地与远程切换功能

2024-03-22 09:52

本文主要是介绍Android仿微信视频聊天本地与远程切换功能,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

一、xml布局

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:app="http://schemas.android.com/apk/res-auto"android:id="@+id/coordinatorLayout"android:layout_width="@dimen/dp_640"android:layout_height="@dimen/dp_400"android:background="@color/pageBgColor"android:orientation="vertical"><!--  视频预览 --><csu.xiaoya.robotApp.ui.activity.homepage.familydct.bean.DraggableTextureViewandroid:id="@+id/preview"android:layout_width="@dimen/dp_640"android:layout_height="@dimen/dp_400"app:layout_constraintEnd_toEndOf="parent"app:layout_constraintLeft_toRightOf="parent"app:layout_constraintTop_toTopOf="parent" /><!--  远程视频 --><csu.xiaoya.robotApp.ui.activity.homepage.familydct.bean.DraggableTextureViewandroid:id="@+id/remoteUserView"android:layout_width="150dp"android:layout_height="180dp"android:layout_marginTop="30dp"android:layout_marginRight="30dp"app:layout_constraintEnd_toEndOf="parent"app:layout_constraintLeft_toRightOf="parent"app:layout_constraintTop_toTopOf="parent" /><ImageViewandroid:id="@+id/imHead"android:layout_width="@dimen/dp_120"android:layout_height="@dimen/dp_120"android:layout_gravity="center"android:layout_marginBottom="@dimen/dp_100"android:scaleType="centerCrop"android:src="@mipmap/doctor_head"app:layout_constraintBottom_toBottomOf="parent"app:layout_constraintEnd_toEndOf="parent"app:layout_constraintStart_toStartOf="parent"app:layout_constraintTop_toTopOf="parent" /><ImageViewandroid:id="@+id/changeVideoWindows"android:layout_width="@dimen/dp_30"android:layout_height="@dimen/dp_30"android:layout_marginLeft="@dimen/dp_30"android:layout_marginTop="@dimen/dp_30"android:background="@drawable/change_windows"android:src="@mipmap/video_windows_change"app:layout_constraintLeft_toLeftOf="parent"app:layout_constraintTop_toTopOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>

  二、切换代码

 /*** 通话大小* 窗口切换*/private boolean isLocalVideoSmallState = true;private void switchWindowMode(VideoChatDialog videoChatDialog, boolean isLocalVideoSmall) {ConstraintLayout constraintLayout = videoChatDialog.findViewById(R.id.coordinatorLayout);TextureView localVideoTextureView = videoChatDialog.findViewById(R.id.preview);TextureView remoteVideoTextureView = videoChatDialog.findViewById(R.id.remoteUserView);ImageView changeVideoWindows = videoChatDialog.findViewById(R.id.changeVideoWindows);ConstraintSet constraintSet = new ConstraintSet();constraintSet.clone(constraintLayout);if (isLocalVideoSmall) {constraintLayout.removeView(localVideoTextureView);constraintLayout.removeView(remoteVideoTextureView);constraintLayout.removeView(changeVideoWindows);constraintLayout.addView(remoteVideoTextureView);constraintLayout.addView(localVideoTextureView);constraintLayout.addView(changeVideoWindows);// 远程端全屏模式remoteVideoTextureView.setEnabled(false);constraintSet.clear(remoteVideoTextureView.getId());constraintSet.connect(remoteVideoTextureView.getId(), ConstraintSet.TOP, ConstraintSet.PARENT_ID, ConstraintSet.TOP, 0);constraintSet.connect(remoteVideoTextureView.getId(), ConstraintSet.END, ConstraintSet.PARENT_ID, ConstraintSet.END, 0);constraintSet.connect(remoteVideoTextureView.getId(), ConstraintSet.RIGHT, ConstraintSet.PARENT_ID, ConstraintSet.RIGHT, 0);constraintSet.constrainWidth(remoteVideoTextureView.getId(), 1280);constraintSet.constrainHeight(remoteVideoTextureView.getId(), 800);// 本地小窗口localVideoTextureView.setEnabled(true);constraintSet.clear(localVideoTextureView.getId());constraintSet.connect(localVideoTextureView.getId(), ConstraintSet.TOP, ConstraintSet.PARENT_ID, ConstraintSet.TOP, 30);constraintSet.connect(localVideoTextureView.getId(), ConstraintSet.END, ConstraintSet.PARENT_ID, ConstraintSet.END, 0);constraintSet.connect(localVideoTextureView.getId(), ConstraintSet.RIGHT, ConstraintSet.PARENT_ID, ConstraintSet.RIGHT, 30);constraintSet.constrainWidth(localVideoTextureView.getId(), 300); // 设置小窗口的宽度constraintSet.constrainHeight(localVideoTextureView.getId(), 200);isLocalVideoSmallState = false;} else {constraintLayout.removeView(remoteVideoTextureView);constraintLayout.removeView(localVideoTextureView);constraintLayout.removeView(changeVideoWindows);constraintLayout.addView(localVideoTextureView);constraintLayout.addView(remoteVideoTextureView);constraintLayout.addView(changeVideoWindows);// 本地 全屏模式localVideoTextureView.setEnabled(false);constraintSet.clear(localVideoTextureView.getId());constraintSet.connect(localVideoTextureView.getId(), ConstraintSet.TOP, ConstraintSet.PARENT_ID, ConstraintSet.TOP, 0);constraintSet.connect(localVideoTextureView.getId(), ConstraintSet.END, ConstraintSet.PARENT_ID, ConstraintSet.END, 0);constraintSet.connect(localVideoTextureView.getId(), ConstraintSet.RIGHT, ConstraintSet.PARENT_ID, ConstraintSet.RIGHT, 0);constraintSet.constrainWidth(localVideoTextureView.getId(), 1280);constraintSet.constrainHeight(localVideoTextureView.getId(), 800);// 远程 小窗口remoteVideoTextureView.setEnabled(true);constraintSet.clear(remoteVideoTextureView.getId());constraintSet.connect(remoteVideoTextureView.getId(), ConstraintSet.TOP, ConstraintSet.PARENT_ID, ConstraintSet.TOP, 30);constraintSet.connect(remoteVideoTextureView.getId(), ConstraintSet.END, ConstraintSet.PARENT_ID, ConstraintSet.END, 0);constraintSet.connect(remoteVideoTextureView.getId(), ConstraintSet.RIGHT, ConstraintSet.PARENT_ID, ConstraintSet.RIGHT, 30);constraintSet.constrainWidth(remoteVideoTextureView.getId(), 300); // 设置小窗口的宽度constraintSet.constrainHeight(remoteVideoTextureView.getId(), 200);isLocalVideoSmallState = true;}constraintSet.applyTo(constraintLayout);}

三、自定义可拖拽TextureView 

/*** 自定义可拖动* TextureView*/public class DraggableTextureView extends TextureView {private float lastX;private float lastY;private boolean isDragging;public DraggableTextureView(Context context) {super(context);init();}public DraggableTextureView(Context context, @Nullable AttributeSet attrs) {super(context, attrs);init();}public DraggableTextureView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {super(context, attrs, defStyleAttr);init();}private void init() {setOnTouchListener(new OnTouchListener() {@Overridepublic boolean onTouch(View v, MotionEvent event) {switch (event.getAction()) {case MotionEvent.ACTION_DOWN:lastX = event.getRawX();lastY = event.getRawY();isDragging = true;break;case MotionEvent.ACTION_MOVE:if (isDragging) {float dx = event.getRawX() - lastX;float dy = event.getRawY() - lastY;int newLeft = (int) (v.getLeft() + dx);int newTop = (int) (v.getTop() + dy);int newRight = (int) (v.getRight() + dx);int newBottom = (int) (v.getBottom() + dy);v.layout(newLeft, newTop, newRight, newBottom);lastX = event.getRawX();lastY = event.getRawY();}break;case MotionEvent.ACTION_UP:case MotionEvent.ACTION_CANCEL:isDragging = false;break;}return true;}});}}

这篇关于Android仿微信视频聊天本地与远程切换功能的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/835068

相关文章

Python的time模块一些常用功能(各种与时间相关的函数)

《Python的time模块一些常用功能(各种与时间相关的函数)》Python的time模块提供了各种与时间相关的函数,包括获取当前时间、处理时间间隔、执行时间测量等,:本文主要介绍Python的... 目录1. 获取当前时间2. 时间格式化3. 延时执行4. 时间戳运算5. 计算代码执行时间6. 转换为指

SpringBoot基于配置实现短信服务策略的动态切换

《SpringBoot基于配置实现短信服务策略的动态切换》这篇文章主要为大家详细介绍了SpringBoot在接入多个短信服务商(如阿里云、腾讯云、华为云)后,如何根据配置或环境切换使用不同的服务商,需... 目录目标功能示例配置(application.yml)配置类绑定短信发送策略接口示例:阿里云 & 腾

解决Maven项目idea找不到本地仓库jar包问题以及使用mvn install:install-file

《解决Maven项目idea找不到本地仓库jar包问题以及使用mvninstall:install-file》:本文主要介绍解决Maven项目idea找不到本地仓库jar包问题以及使用mvnin... 目录Maven项目idea找不到本地仓库jar包以及使用mvn install:install-file基

Android实现在线预览office文档的示例详解

《Android实现在线预览office文档的示例详解》在移动端展示在线Office文档(如Word、Excel、PPT)是一项常见需求,这篇文章为大家重点介绍了两种方案的实现方法,希望对大家有一定的... 目录一、项目概述二、相关技术知识三、实现思路3.1 方案一:WebView + Office Onl

Maven如何手动安装依赖到本地仓库

《Maven如何手动安装依赖到本地仓库》:本文主要介绍Maven如何手动安装依赖到本地仓库问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、下载依赖二、安装 JAR 文件到本地仓库三、验证安装四、在项目中使用该依赖1、注意事项2、额外提示总结一、下载依赖登

Android实现两台手机屏幕共享和远程控制功能

《Android实现两台手机屏幕共享和远程控制功能》在远程协助、在线教学、技术支持等多种场景下,实时获得另一部移动设备的屏幕画面,并对其进行操作,具有极高的应用价值,本项目旨在实现两台Android手... 目录一、项目概述二、相关知识2.1 MediaProjection API2.2 Socket 网络

Redis消息队列实现异步秒杀功能

《Redis消息队列实现异步秒杀功能》在高并发场景下,为了提高秒杀业务的性能,可将部分工作交给Redis处理,并通过异步方式执行,Redis提供了多种数据结构来实现消息队列,总结三种,本文详细介绍Re... 目录1 Redis消息队列1.1 List 结构1.2 Pub/Sub 模式1.3 Stream 结

MySQL索引的优化之LIKE模糊查询功能实现

《MySQL索引的优化之LIKE模糊查询功能实现》:本文主要介绍MySQL索引的优化之LIKE模糊查询功能实现,本文通过示例代码给大家介绍的非常详细,感兴趣的朋友一起看看吧... 目录一、前缀匹配优化二、后缀匹配优化三、中间匹配优化四、覆盖索引优化五、减少查询范围六、避免通配符开头七、使用外部搜索引擎八、分

Android实现悬浮按钮功能

《Android实现悬浮按钮功能》在很多场景中,我们希望在应用或系统任意界面上都能看到一个小的“悬浮按钮”(FloatingButton),用来快速启动工具、展示未读信息或快捷操作,所以本文给大家介绍... 目录一、项目概述二、相关技术知识三、实现思路四、整合代码4.1 Java 代码(MainActivi

Android Mainline基础简介

《AndroidMainline基础简介》AndroidMainline是通过模块化更新Android核心组件的框架,可能提高安全性,本文给大家介绍AndroidMainline基础简介,感兴趣的朋... 目录关键要点什么是 android Mainline?Android Mainline 的工作原理关键