悬浮小窗口在直播项目中还是比较常见的需求,在直播间打开其它界面或者退到桌面继续播放直播内容,下面是我的实现方案。

效果图

实现思路

其实很容易想到,可以通过 WindowManageraddView()实现,不过需要用户同意悬浮窗的权限,如果你的项目是应用内的悬浮窗,也可以去获取 DecorView给它添加一个View,这样就不用去获取权限了

悬浮窗权限获取

manifest添加权限

<!--    悬浮窗权限-->
<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />

Window设置一下type类型,这里 8.0 版本之后类型有改变这里做个判断

if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.O) {layoutParams.type = WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY
} else {layoutParams.type = WindowManager.LayoutParams.TYPE_SYSTEM_ALERT
}

权限判断

悬浮窗需要用户手动开启,这里需要给用户做一个引导

if (!Settings.canDrawOverlays(this)) { // 判断是否有权限val intent = Intent(Settings.ACTION_MANAGE_OVERLAY_PERMISSION)// packageName 是应用的包名intent.data = Uri.parse("package:$packageName")// 直接打开系统的同意界面给用户操作startActivityForResult(intent, REQ_CODE_1000)
}@RequiresApi(Build.VERSION_CODES.M)
override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {super.onActivityResult(requestCode, resultCode, data)if (requestCode == REQ_CODE_1000) {if (Settings.canDrawOverlays(this)) {// 用户同意了就可以进行其它操作了}}
}

处理滑动和惯性滑动

滑动的处理是通过 WindowManagerupdateViewLayout()方法,根据滑动的距离改变Window的位置,不过处理滑动前要计算一下滑动的距离是否超过了可滑动的边界,不能让我们的悬浮窗跑到屏幕外面去

惯性滑动就是模板代码了,交给GestureDetectoronFling()方法,然后通过OverScroller计算当前滑动的值

还要一点需要注意,我们的悬浮窗不仅要处理滑动时间还要处理点击事件,当用户点击窗口的时候还要回到直播页面的,当前面吧onTouchEvent交给GestureDetector去处理时点击事件就不起作用了,也就是setOnClickListener设置没有作用了,这边要手动调一下这个回调

override fun onSingleTapConfirmed(e: MotionEvent?): Boolean {// 触发 onClick() 回调performClick()return true
}

封装思路

悬浮窗有一些可变部分和不变部分,可变的就是悬浮窗的样式以及具体播放的操作,不变的就是滑动的操作,所以把这两部分分开,使用适配器模式连接这两部分,在适配器里面用户可以自定义布局和实现自己的业务逻辑。由于悬浮窗要作用于全局,同一时间只能有一个,所以用一个单例类FloatWindow去管理 View 的添加删除操作。

// 创建 FloatView 设置 Adapter
val floatView = FloatView(this).apply {setAdapter(SimpleAdapter())
}
// 把 View 设置给 Window
FloatWindow.getInstance(this).bindView(floatView)
// 移除 Window
FloatWindow.getInstance(this).removeView()

源码地址

github地址

效果图

Android 直播中的悬浮小窗以及封装相关推荐

  1. Android 直播中弹幕、带货和键盘的交互

    mAttachInfo.mTreeObserver.dispatchOnGlobalLayout(); } 当一个 Activity或者是Dialog 这样的 Window对添加的布局完成测量和布局后 ...

  2. Android 直播中弹幕、带货和键盘的交互,android视频开发框架

    // 改变当前布局的大小来适应键盘,会触发 GlobalLayoutListener 回调,这个配置就非常适合做微信这种 IM 聊天界面 android:windowSoftInputMode=&qu ...

  3. 关于Android应用中的悬浮窗(一)——权限

    现在越来越多的Android APP都有悬浮窗的功能,公司项目中最新的需求也需要加入悬浮窗的功能,这次的功能是指在应用内的悬浮窗(而不是系统级别的悬浮窗).悬浮窗功能的时候,整体分了2个部分: - 悬 ...

  4. Android/Ophone中的悬浮对话框和即点即关对话框

    Activity是Ophone系统的4个应用程序组件之一.通过传统方法显示的Activity都是充满整个屏幕,也就是全屏的Activity.事实上,Activity不仅可以全屏显示,还可以象对话框一样 ...

  5. android 中自定义安装,Android开发中ListView自定义adapter的封装

    [引入] 我们一般编写listView的时候顺序是这样的: •需要展示的数据集List •为这个数据集编写一个ListView •为这个ListView编写一个Adapter,一般继承自BaseAda ...

  6. Android直播中弹幕效果实现

    在B站或者其他视频网站看视频时,常常会打开弹幕效果,边看节目边看大家的吐槽.弹幕看起来很有意思,今天我们就来实现一个简单的弹幕效果. 从直观上,弹幕效果就是在一个ViewGroup上增加一些View, ...

  7. Android直播开发之旅(4):MP3编码格式分析与lame库编译封装

    转载请声明出处:http://blog.csdn.net/andrexpert/article/77683776 一.Mp3编码格式分析 MP3,全称MPEG Audio Layer3,是一种高效的计 ...

  8. Android Video Player. 安卓视频播放器,封装 MediaPlayer、ExoPlayer、IjkPlayer。模仿抖音,悬浮播放,广告播放,列表播放,弹幕

    DKVideoPlayer 项目地址:dueeeke/DKVideoPlayer 简介: Android Video Player. 安卓视频播放器,封装 MediaPlayer.ExoPlayer. ...

  9. Android直播开发之旅(3):AAC编码格式分析与MP4文件封装(MediaCodec+MediaMuxer)

    Android直播开发之旅(3):AAC编码格式分析与MP4文件封装(MediaCodec+MediaMuxer) (码字不易,转载请声明出处:http://blog.csdn.net/andrexp ...

最新文章

  1. python的nan,NaN,NAN
  2. 在原有Android项目中快速集成React Native
  3. rand生成随机数的范围_JS中生成指定范围随机数
  4. python基础教程: __del__() 清空对象
  5. django-模型类的修改-添加与删除字段
  6. PhotoSwipe源码解读系列(二)
  7. VS Code 的插件位置更改
  8. 探讨专线与家用宽带的区别
  9. 【学习教程】CMIP6数据处理方法与典型案例分析
  10. 在线抽奖、限时秒杀、拼团抢购,别的商城有的功能你也可以轻松拥有!
  11. 天猫盒子 显示电脑连接服务器失败,天猫魔盒访问电脑共享文件需要密码的解决方法...
  12. 安装office2007 1706错误
  13. 行为/心理健康软件的全球与中国市场2022-2028年:技术、参与者、趋势、市场规模及占有率研究报告
  14. Nginx: 104: Connection reset by peer 错误
  15. 计算机联锁中JDF是什么组合,2019年新准线海勒斯壕南站站改工程招标公告
  16. larval 数据库迁移
  17. 第三周《java语言程序设计——面向对象入门》学习总结
  18. Windows 下使用pip install 安装出现报错ERROR: Cannot unpack file解决办法
  19. 操作系统——学习资料
  20. 联想e470锁定计算机,联想ThinkPad笔记本Fn键关闭与启用方法

热门文章

  1. sql server 数据库优化--显示执行计划
  2. php实现进制转换计算器,PHP进制相互转换计算实现步骤
  3. 知识蒸馏论文翻译(5)—— Feature Normalized Knowledge Distillation for Image Classification(图像分类)
  4. 弘辽科技:多多进宝有哪些优势?
  5. 管理高效优秀团队的,都懂这3条天规,请静下心感悟!
  6. NN和KNN的简单概念
  7. 启动http报错AH00558:Could not reliably determine the server‘s fully qualified domain name using解决办法
  8. 飞康SDS转型!成功者的姿势Get
  9. 我们计划招收300位生信人,免费攻读发论文技巧!
  10. MySQL索引B+数(超级好看,一看就懂!!!)