热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

一对一直播源码开发,表情面板无缝切换的实现

在一对一直播源码使用过程中,有时会出现软键盘切换闪屏问题,就是当切换表情的时候屏幕会跳动,因此要对一对一直播源码表情面板无缝切换进行优化。

在一对一直播源码使用过程中,有时会出现软键盘切换闪屏问题,就是当切换表情的时候屏幕会跳动,因此要对一对一直播源码表情面板无缝切换进行优化。

第一步
在module的build.gradle中加入(这个库很小,8个类,最大类也就200来行代码,小类几十行代码)

compile 'net.qiujuer.widget:airpanel:1.0.0'

第二步
创建空气面板布局lay_chat_air_panel.xml(这个里面就需要用到库中的自定的一个控件了)




AirPanelLinearLayout

这里给出这个fragment的相关逻辑实现(当然这个逻辑和软键盘没有任何关系了,只是负责控制哪个面板的显示和隐藏,因为所有的关于软键盘的控制都已经被AirPanelLinearLayout完成了)

public class PanelFragment extends BaseFragment implements FaceListener {//表情面板private View mFacePanel;//图片相册面板private View mGalleryPanel;//录音面板private View mRecordPanel;private PanelCallback mCallback;public PanelFragment() {// Required empty public constructor}@Overrideprotected int getContentLayoutId() {return R.layout.fragment_panel;}@Overrideprotected void initView(View view) {super.initView(view);initRecord(view);initFace(view);initGallery(view);}//初始化表情布局private void initFace(View root) {View facePanel = mFacePanel = root.findViewById(R.id.lay_face_panel);//todo 接下来就是相关的表情加载和相关点击的实现 这个有空就为大家在以后的文章中讲解//}/*** 初始化录音布局** @param root 根布局*/private void initRecord(View root) {View recordPanel = mRecordPanel = root.findViewById(R.id.lay_record_panel);//todo 接下来就是相关的语音录制相关点击的实现 这个有空就为大家在以后的文章中讲解}/*** 初始化图片画廊** @param root 根布局*/private void initGallery(View root) {View galleryPanel = mGalleryPanel = root.findViewById(R.id.lay_gallery_panel);//todo 接下来就是相关的图片展示和相关点击的实现 这个有空就为大家在以后的文章中讲解}/*** 发送** @param galleryView* @param paths*/private void onSendGalleryClick(GalleryView galleryView, String[] paths) {galleryView.clear();PanelCallback callback = mCallback;if (callback == null)return;callback.onSendGalleryClick(paths);}public void setup(PanelCallback callback) {this.mCallback = callback;}public boolean isOpenFace() {return mFacePanel.getVisibility() == View.VISIBLE;}public boolean isOpenMore() {return mGalleryPanel.getVisibility() == View.VISIBLE;}/*** 显示表情界面*/public void showFace() {mFacePanel.setVisibility(View.VISIBLE);mGalleryPanel.setVisibility(View.GONE);mRecordPanel.setVisibility(View.GONE);}/*** 显示录音界面*/public void showRecord() {mFacePanel.setVisibility(View.GONE);mGalleryPanel.setVisibility(View.GONE);mRecordPanel.setVisibility(View.VISIBLE);}/*** 显示图片界面*/public void showGallery() {mFacePanel.setVisibility(View.GONE);mGalleryPanel.setVisibility(View.VISIBLE);mRecordPanel.setVisibility(View.GONE);GalleryView view = (GalleryView) mGalleryPanel.findViewById(R.id.view_gallery);view.clear();}public void showMore() {showGallery();}/*** 面板变化和相关输入输出的回调*/public interface PanelCallback {//获取到输入的EditText的值EditText getInputEditText();/*** 点击发送按钮的时候发送图片地址集合** @param paths 本地相册图片路径*/void onSendGalleryClick(String[] paths);/*** 录音完成的时候回调** @param file 录音文件* @param time 录音时长*/void onRecordDone(File file, long time);}
}

这个时候万事俱备,只差我们怎么使用了,不急,一步一步来,毕竟心急吃不了热豆腐。刚才创建的那个布局,我们放到我们需要使用的fragment或者activity的布局里面

好了,看下如何在fragment编写相关逻辑吧,当然我这里使用的是fragment,activity里面使用的逻辑也是一样的。

//第一步//刚才我们实现的面板fragmentprivate PanelFragment mPanelContent;//接口private AirPanel.Boss mPanelBoss;//第二步mPanelBoss = (AirPanel.Boss) view.findViewById(R.id.lay_container); //这个id就是根布局的id (也就是AirPanelLinearLayout或者是子类的id)mPanelBoss.setPanelListener(new AirPanel.Listener() {@Overridepublic void requestHideSoftKeyboard() {// 这里面传递的是EditText控件 也就是我们的输入控件 Util这个方法是集成的库中的工具类Util.hideKeyboard(mEtContent);}});//第三步 找到我们的fragment 可以操作里面的控制逻辑PanelFragment fragment = (PanelFragment) getChildFragmentManager().findFragmentById(R.id.frag_panel);//让我们的fragment实现这个方法PanelCallbackfragment.setup(this);mPanelContent = fragment;//这个时候我们可以操作了 因为实现了PanelCallback这个接口,那么会实现里面的方法,我们看下如何处理吧@Overridepublic EditText getInputEditText() {//获取表情输入 当然需要自己进行转换return mEtContent;}@Overridepublic void onSendGalleryClick(String[] paths) {//图片地址 这个时候我们需要进行上传逻辑mPresenter.pushImages(paths);}@Overridepublic void onRecordDone(File file, long time) {//语音的发起mPresenter.pushAudio(file.getAbsolutePath(), time);}

然后我们看下点击逻辑吧

//语音切换@OnClick(R.id.btn_record)void onRecordClick() {if (mPanelBoss.isOpen()) {Util.showKeyboard(mEtContent);} else {mPanelContent.showRecord();mPanelBoss.openPanel();}}//图片点击private void onMoreClick() {if (mPanelBoss.isOpen() && mPanelContent.isOpenMore()) {Util.showKeyboard(mEtContent);} else {mPanelContent.showMore();mPanelBoss.openPanel();}}//表情点击@OnClick(R.id.btn_face)void onFaceClick() {if (mPanelBoss.isOpen() && mPanelContent.isOpenFace()) {//显示输入法Util.showKeyboard(mEtContent);} else {mPanelContent.showFace();mPanelBoss.openPanel();}}

好了,这个时候就已经完美的实现了一对一直播源码中表情、输入法、语音、图片面板的切换了,是不是很简单哈。以上就是“一对一直播源码开发,表情面板无缝切换的实现”的全部内容了,希望对大家有帮助。


推荐阅读
  • 今天就跟大家聊聊有关怎么在Android应用中实现一个换肤功能,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根 ... [详细]
  • Android开发实现的计时器功能示例
    本文分享了Android开发实现的计时器功能示例,包括效果图、布局和按钮的使用。通过使用Chronometer控件,可以实现计时器功能。该示例适用于Android平台,供开发者参考。 ... [详细]
  • 2021年最详细的Android屏幕适配方案汇总
    1Android屏幕适配的度量单位和相关概念建议在阅读本文章之前,可以先阅读快乐李同学写的文章《Android屏幕适配的度量单位和相关概念》,这篇文章 ... [详细]
  • 这两天用到了ListView,写下遇到的一些问题。首先是ListView本身与子控件的焦点问题,比如我这里子控件用到了Button,在需要ListView中的根布局属性上加上下面的这一个属性:and ... [详细]
  • 本文介绍了使用kotlin实现动画效果的方法,包括上下移动、放大缩小、旋转等功能。通过代码示例演示了如何使用ObjectAnimator和AnimatorSet来实现动画效果,并提供了实现抖动效果的代码。同时还介绍了如何使用translationY和translationX来实现上下和左右移动的效果。最后还提供了一个anim_small.xml文件的代码示例,可以用来实现放大缩小的效果。 ... [详细]
  • 在Xamarin XAML语言中如何在页面级别构建ControlTemplate控件模板
    本文介绍了在Xamarin XAML语言中如何在页面级别构建ControlTemplate控件模板的方法和步骤,包括将ResourceDictionary添加到页面中以及在ResourceDictionary中实现模板的构建。通过本文的阅读,读者可以了解到在Xamarin XAML语言中构建控件模板的具体操作步骤和语法形式。 ... [详细]
  • 带添加按钮的GridView,item的删除事件
    先上图片效果;gridView无数据时显示添加按钮,有数据时,第一格显示添加按钮,后面显示数据:布局文件:addr_manage.xml<?xmlve ... [详细]
  • SmartRefreshLayout自定义头部刷新和底部加载
    1.添加依赖implementation‘com.scwang.smartrefresh:SmartRefreshLayout:1.0.3’implementation‘com.s ... [详细]
  • Android Studio Bumblebee | 2021.1.1(大黄蜂版本使用介绍)
    本文介绍了Android Studio Bumblebee | 2021.1.1(大黄蜂版本)的使用方法和相关知识,包括Gradle的介绍、设备管理器的配置、无线调试、新版本问题等内容。同时还提供了更新版本的下载地址和启动页面截图。 ... [详细]
  • Go GUIlxn/walk 学习3.菜单栏和工具栏的具体实现
    本文介绍了使用Go语言的GUI库lxn/walk实现菜单栏和工具栏的具体方法,包括消息窗口的产生、文件放置动作响应和提示框的应用。部分代码来自上一篇博客和lxn/walk官方示例。文章提供了学习GUI开发的实际案例和代码示例。 ... [详细]
  • 移动端常用单位——rem的使用方法和注意事项
    本文介绍了移动端常用的单位rem的使用方法和注意事项,包括px、%、em、vw、vh等其他常用单位的比较。同时还介绍了如何通过JS获取视口宽度并动态调整rem的值,以适应不同设备的屏幕大小。此外,还提到了rem目前在移动端的主流地位。 ... [详细]
  • 本文详细介绍了Android中的坐标系以及与View相关的方法。首先介绍了Android坐标系和视图坐标系的概念,并通过图示进行了解释。接着提到了View的大小可以超过手机屏幕,并且只有在手机屏幕内才能看到。最后,作者表示将在后续文章中继续探讨与View相关的内容。 ... [详细]
  • wpf+mvvm代码组织结构及实现方式
    本文介绍了wpf+mvvm代码组织结构的由来和实现方式。作者回顾了自己大学时期接触wpf开发和mvvm模式的经历,认为mvvm模式使得开发更加专注于业务且高效。与此同时,作者指出mvvm模式相较于mvc模式的优势。文章还提到了当没有mvvm时处理数据和UI交互的例子,以及前后端分离和组件化的概念。作者希望能够只关注原始数据结构,将数据交给UI自行改变,从而解放劳动力,避免加班。 ... [详细]
  • 1简介本文结合数字信号处理课程和Matlab程序设计课程的相关知识,给出了基于Matlab的音乐播放器的总体设计方案,介绍了播放器主要模块的功能,设计与实现方法.我们将该设 ... [详细]
  • 开发笔记:图像识别基于主成分分析算法实现人脸二维码识别
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了图像识别基于主成分分析算法实现人脸二维码识别相关的知识,希望对你有一定的参考价值。 ... [详细]
author-avatar
风云再起2012668
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有