android 弹幕框架DanmakuFlameMaster,解决 控制Ui和弹幕点击的问题.
android 直播弹幕,在使用之前,如果有人对DanmakuFlameMaster还不了解怎么用的话,可以参考郭霖的这个博客郭霖的弹幕功能实现的博客.
但是在这里我还是建议大家直接看DanmakuFlameMaster的官方Demo,因为版本的迭代,而上面这篇博客某些地方Api已经过时.
- 下面借助郭大神博客的一张图:
- 在这样图中我们可以看到VoideView在最底层 -> 弹幕VIew -操作View
- VoideView :只有播放视频的api,毫无交互操作
- 弹幕View : 显示弹幕view, 弹幕有可能需要点击效果
- 操作View : 双击:播放/暂停 , 单点:显示/隐藏 整个操作的VIew , 左上滑 +亮度 , 左滑 +声音.
那么问题来了,弹幕需要点击,那么就会拦截按下, 操作View也需要点击和双击,也会拦截按下.
下面就是解决这个问题的方法: 思路:既然两个都需要拦截点击事件,那么就直接让两个View的setOnTouchListener合并成一个setOnTouchListener,但是这里有两个问题:
- 合并到谁: 合并到DanmakuFlameMaster库的DanmakuView
- DanmakuFlameMaster是用implementation'com.github.ctiao:DanmakuFlameMaster:0.9.25'依赖的,怎么样来解决框架内部的setOnTouchListener事件呢? 答案:反射.
/*master.flame.danmaku.ui.widget.DanmakuView 的源码,可以看到使用自定义TouchHelper,源码里面直接拦截了*/@Overridepublic boolean onTouchEvent(MotionEvent event) {boolean isEventConsumed = mTouchHelper.onTouchEvent(event);if (!isEventConsumed) {return super.onTouchEvent(event);}return isEventConsumed;}/*master.flame.danmaku.ui.widget.DanmakuTouchHelper,可以看到源码里面onDown方法只要设置OnDanmakuClickListener,那么就返回true,这样是有问题的,不管是把DanmakuView覆盖在VoideControlBox上,还是在VoideControlBox 下都被令另外一个View 的事件出问题.*/private final android.view.GestureDetector.OnGestureListener mOnGestureListener = new GestureDetector.SimpleOnGestureListener() {@Overridepublic boolean onDown(MotionEvent event) {if (danmakuView != null) {IDanmakuView.OnDanmakuClickListener onDanmakuClickListener = danmakuView.getOnDanmakuClickListener();if (onDanmakuClickListener != null) {mXOff = danmakuView.getXOff();mYOff = danmakuView.getYOff();return true;}}return false;}//....省略了部分代码};/**解决办法,反射获取mTouchHelper,模拟onTouchEvent();然后把自己的VoideControlBox的一些事件也交给setOnTouchListener来处理,下面请看代码*/DanmakuTouchHelper mTouchHelper;try {Field field = mPlayDanmakuView.getClass().getDeclaredField("mTouchHelper");field.setAccessible(true);Object obj = field.get(mPlayDanmakuView);if (obj instanceof DanmakuTouchHelper) {mTouchHelper = (DanmakuTouchHelper) obj;}} catch (Exception e) {e.printStackTrace();}//mPlayDanmakuView 这是弹幕View 的对象.mPlayDanmakuView.setOnTouchListener(new View.OnTouchListener() {@Overridepublic boolean onTouch(View v, MotionEvent event) {//ControlBox 的事件处理返回boolean isEvent = mPlayerHelper.mGestureDetector.onTouchEvent(event);boolean isEventConsumed = false;// 如果反射拿到了mTouchHelper ,执行onTouchEvent方法.if (mTouchHelper != null) {isEventConsumed = mTouchHelper.onTouchEvent(event);}//如果是ControlBox返回为true 或者是弹幕事件返回为true, 消费该事件if (isEvent || isEventConsumed) {return true;}// 处理手势结束, 取消一些如音量View,亮度Viewswitch (event.getAction() & MotionEvent.ACTION_MASK) {case MotionEvent.ACTION_UP:mPlayerHelper.endGesture();break;}return true;}});- 好了,如果有朋友没懂的可以加我QQ 97149859咨询.复制代码
android 弹幕框架DanmakuFlameMaster,解决 控制Ui和弹幕点击的问题.相关推荐
- 树莓派小车教程(二)之——基于Tornado框架的网页控制小车(按键+鼠标点击)
项目场景: 前两天笔者写了一份手把手树莓派小车教程(一)之--小车跑起来的教程.当时只是让小车能动起来,不过项目中的小车肯定是需要一个用户界面能够操控的. 能看到这一部分的读者们可能基本都会简单的控制 ...
- 用户界面设计之关于控制UI界面的简单总结
用户界面设计是Android应用开发的一项重要内容.Android提供了四种控制UI界面的方法,分别为: 1.使用XML布局文件控制UI界面 2.在代码中控制UI界面 3.使用XML和Java代码混合 ...
- Android(五)——控制UI界面的方法
文章目录 1. 使用XML布局文件控制UI界面(推荐) 2. 在Java代码中控制UI界面 3. 使用XML和Java代码混合控制UI界面 4. 开发自定义的View 1. 使用XML布局文件控制UI ...
- android 动画开源框架,图文简介非常炫酷的Android开源框架之UI框架
架构,其又名软件架构,是关于软件整体结构与组件的抽象描述,用于指导大型软件系统各个方面的设计.而软件架构(software architecture)是一系列相关的抽象模式,其是用来指导大型软件系统各 ...
- android 常用框架整理
文章目录 UI 框架 WebView 框架 具体内容 UI 卫星菜单 节选器 下拉刷新 模糊效果 HUD与Toast 进度条 UI其他 动画 网络相关 网络连接 网络测试 图像获取 响应式编程 地图 ...
- Android 开源框架精选
1. github排名 https://github.com/trending,github搜索:https://github.com/search 2.https://github.com/wasa ...
- 百家争鸣:Android开源框架排行榜
一.榜单介绍 排行榜包括四大类: 单一框架:仅提供路由.网络层.UI层.通信层或其他单一功能的框架 混合开发框架:提供开发hybrid app.h5与webview结合能力.web app能力的框架 ...
- Android流行框架(二)
第一部分 个性化控件(View) 主要介绍那些不错个性化的 View,包括 ListView.ActionBar.Menu.ViewPager.Gallery.GridView.ImageView.P ...
- 震撼发布2017年Android百大框架排行榜
一.榜单介绍 排行榜包括四大类: 单一框架:仅提供路由.网络层.UI层.通信层或其他单一功能的框架 混合开发框架:提供开发hybrid app.h5与webview结合能力.web app能力的框架 ...
最新文章
- 问题 A: 第二题(划分一个集合为差值最小的两个子集合)
- java和c 的rsa加密算法_RSA算法签名技术Java与C++统一(加密解密结果一样)
- 群体运动度量--Measuring Crowd Collectiveness
- 2020-10-18C++笔记之C/C++之字符串赋值
- 计算机录入的课程标准,《计算机录入技术》课程标准.doc
- call、apply、bind
- error: jump to label ‘XXXX’ [-fpermissive]
- how to improve efficiency of graphic neural network?
- 任正非:华为 5G 是瞎猫碰死老鼠
- 在DOS下如何加载SATA光驱驱动
- ASP.NET 如何在网页中获取根目录
- pycharm无需汉化教程(无需下载汉化包)
- zbbz的lisp_学习LISP语言的体会
- 各大IT公司经典面试题总结
- 裴蜀定理、拓展欧几里得及其证明
- 几种常用的网络路由交换协议【路由协议】
- Flutter: 千位数加逗号分隔
- FMCW雷达在汽车自适应巡航中的应用(学习摘自MathWorks笔记)
- VMware安装Ubuntu虚拟机如何连接网络
- java-php-python-ssm汽车售后服务管理系统计算机毕业设计