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和弹幕点击的问题.相关推荐

  1. 树莓派小车教程(二)之——基于Tornado框架的网页控制小车(按键+鼠标点击)

    项目场景: 前两天笔者写了一份手把手树莓派小车教程(一)之--小车跑起来的教程.当时只是让小车能动起来,不过项目中的小车肯定是需要一个用户界面能够操控的. 能看到这一部分的读者们可能基本都会简单的控制 ...

  2. 用户界面设计之关于控制UI界面的简单总结

    用户界面设计是Android应用开发的一项重要内容.Android提供了四种控制UI界面的方法,分别为: 1.使用XML布局文件控制UI界面 2.在代码中控制UI界面 3.使用XML和Java代码混合 ...

  3. Android(五)——控制UI界面的方法

    文章目录 1. 使用XML布局文件控制UI界面(推荐) 2. 在Java代码中控制UI界面 3. 使用XML和Java代码混合控制UI界面 4. 开发自定义的View 1. 使用XML布局文件控制UI ...

  4. android 动画开源框架,图文简介非常炫酷的Android开源框架之UI框架

    架构,其又名软件架构,是关于软件整体结构与组件的抽象描述,用于指导大型软件系统各个方面的设计.而软件架构(software architecture)是一系列相关的抽象模式,其是用来指导大型软件系统各 ...

  5. android 常用框架整理

    文章目录 UI 框架 WebView 框架 具体内容 UI 卫星菜单 节选器 下拉刷新 模糊效果 HUD与Toast 进度条 UI其他 动画 网络相关 网络连接 网络测试 图像获取 响应式编程 地图 ...

  6. Android 开源框架精选

    1. github排名 https://github.com/trending,github搜索:https://github.com/search 2.https://github.com/wasa ...

  7. 百家争鸣:Android开源框架排行榜

    一.榜单介绍 排行榜包括四大类: 单一框架:仅提供路由.网络层.UI层.通信层或其他单一功能的框架 混合开发框架:提供开发hybrid app.h5与webview结合能力.web app能力的框架 ...

  8. Android流行框架(二)

    第一部分 个性化控件(View) 主要介绍那些不错个性化的 View,包括 ListView.ActionBar.Menu.ViewPager.Gallery.GridView.ImageView.P ...

  9. 震撼发布2017年Android百大框架排行榜

    一.榜单介绍 排行榜包括四大类: 单一框架:仅提供路由.网络层.UI层.通信层或其他单一功能的框架 混合开发框架:提供开发hybrid app.h5与webview结合能力.web app能力的框架 ...

最新文章

  1. 问题 A: 第二题(划分一个集合为差值最小的两个子集合)
  2. java和c 的rsa加密算法_RSA算法签名技术Java与C++统一(加密解密结果一样)
  3. 群体运动度量--Measuring Crowd Collectiveness
  4. 2020-10-18C++笔记之C/C++之字符串赋值
  5. 计算机录入的课程标准,《计算机录入技术》课程标准.doc
  6. call、apply、bind
  7. error: jump to label ‘XXXX’ [-fpermissive]
  8. how to improve efficiency of graphic neural network?
  9. 任正非:华为 5G 是瞎猫碰死老鼠
  10. 在DOS下如何加载SATA光驱驱动
  11. ASP.NET 如何在网页中获取根目录
  12. pycharm无需汉化教程(无需下载汉化包)
  13. zbbz的lisp_学习LISP语言的体会
  14. 各大IT公司经典面试题总结
  15. 裴蜀定理、拓展欧几里得及其证明
  16. 几种常用的网络路由交换协议【路由协议】
  17. Flutter: 千位数加逗号分隔
  18. FMCW雷达在汽车自适应巡航中的应用(学习摘自MathWorks笔记)
  19. VMware安装Ubuntu虚拟机如何连接网络
  20. java-php-python-ssm汽车售后服务管理系统计算机毕业设计

热门文章

  1. qt源码学习---QMetaObject(二)
  2. 变量的定义以及数据类型
  3. 虚拟机与MySQL的安装及配置
  4. AtCoder Beginner Contest 153 题解
  5. mysql添加多个字段删除多个字段
  6. 我的ubuntu8.04安装经验
  7. java程序员自己的图片转文字OCR识图工具
  8. 乐鑫esp8266学习rtos3.0笔记:仅1M flash 的安信可 ESP-01S 模块,如何二次开发?如何对其 OTA 远程升级固件!
  9. java静态方法详解
  10. 文件共享服务器onedrive,如何共享OneDrive文件和文件夹