Android 直播中的悬浮小窗以及封装
悬浮小窗口在直播项目中还是比较常见的需求,在直播间打开其它界面或者退到桌面继续播放直播内容,下面是我的实现方案。
效果图
实现思路
其实很容易想到,可以通过 WindowManager
的 addView()
实现,不过需要用户同意悬浮窗的权限,如果你的项目是应用内的悬浮窗,也可以去获取 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)) {// 用户同意了就可以进行其它操作了}}
}
处理滑动和惯性滑动
滑动的处理是通过 WindowManager
的updateViewLayout()
方法,根据滑动的距离改变Window
的位置,不过处理滑动前要计算一下滑动的距离是否超过了可滑动的边界,不能让我们的悬浮窗跑到屏幕外面去
惯性滑动就是模板代码了,交给GestureDetector
的onFling()
方法,然后通过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 直播中的悬浮小窗以及封装相关推荐
- Android 直播中弹幕、带货和键盘的交互
mAttachInfo.mTreeObserver.dispatchOnGlobalLayout(); } 当一个 Activity或者是Dialog 这样的 Window对添加的布局完成测量和布局后 ...
- Android 直播中弹幕、带货和键盘的交互,android视频开发框架
// 改变当前布局的大小来适应键盘,会触发 GlobalLayoutListener 回调,这个配置就非常适合做微信这种 IM 聊天界面 android:windowSoftInputMode=&qu ...
- 关于Android应用中的悬浮窗(一)——权限
现在越来越多的Android APP都有悬浮窗的功能,公司项目中最新的需求也需要加入悬浮窗的功能,这次的功能是指在应用内的悬浮窗(而不是系统级别的悬浮窗).悬浮窗功能的时候,整体分了2个部分: - 悬 ...
- Android/Ophone中的悬浮对话框和即点即关对话框
Activity是Ophone系统的4个应用程序组件之一.通过传统方法显示的Activity都是充满整个屏幕,也就是全屏的Activity.事实上,Activity不仅可以全屏显示,还可以象对话框一样 ...
- android 中自定义安装,Android开发中ListView自定义adapter的封装
[引入] 我们一般编写listView的时候顺序是这样的: •需要展示的数据集List •为这个数据集编写一个ListView •为这个ListView编写一个Adapter,一般继承自BaseAda ...
- Android直播中弹幕效果实现
在B站或者其他视频网站看视频时,常常会打开弹幕效果,边看节目边看大家的吐槽.弹幕看起来很有意思,今天我们就来实现一个简单的弹幕效果. 从直观上,弹幕效果就是在一个ViewGroup上增加一些View, ...
- Android直播开发之旅(4):MP3编码格式分析与lame库编译封装
转载请声明出处:http://blog.csdn.net/andrexpert/article/77683776 一.Mp3编码格式分析 MP3,全称MPEG Audio Layer3,是一种高效的计 ...
- Android Video Player. 安卓视频播放器,封装 MediaPlayer、ExoPlayer、IjkPlayer。模仿抖音,悬浮播放,广告播放,列表播放,弹幕
DKVideoPlayer 项目地址:dueeeke/DKVideoPlayer 简介: Android Video Player. 安卓视频播放器,封装 MediaPlayer.ExoPlayer. ...
- Android直播开发之旅(3):AAC编码格式分析与MP4文件封装(MediaCodec+MediaMuxer)
Android直播开发之旅(3):AAC编码格式分析与MP4文件封装(MediaCodec+MediaMuxer) (码字不易,转载请声明出处:http://blog.csdn.net/andrexp ...
最新文章
- python的nan,NaN,NAN
- 在原有Android项目中快速集成React Native
- rand生成随机数的范围_JS中生成指定范围随机数
- python基础教程: __del__() 清空对象
- django-模型类的修改-添加与删除字段
- PhotoSwipe源码解读系列(二)
- VS Code 的插件位置更改
- 探讨专线与家用宽带的区别
- 【学习教程】CMIP6数据处理方法与典型案例分析
- 在线抽奖、限时秒杀、拼团抢购,别的商城有的功能你也可以轻松拥有!
- 天猫盒子 显示电脑连接服务器失败,天猫魔盒访问电脑共享文件需要密码的解决方法...
- 安装office2007 1706错误
- 行为/心理健康软件的全球与中国市场2022-2028年:技术、参与者、趋势、市场规模及占有率研究报告
- Nginx: 104: Connection reset by peer 错误
- 计算机联锁中JDF是什么组合,2019年新准线海勒斯壕南站站改工程招标公告
- larval 数据库迁移
- 第三周《java语言程序设计——面向对象入门》学习总结
- Windows 下使用pip install 安装出现报错ERROR: Cannot unpack file解决办法
- 操作系统——学习资料
- 联想e470锁定计算机,联想ThinkPad笔记本Fn键关闭与启用方法
热门文章
- sql server 数据库优化--显示执行计划
- php实现进制转换计算器,PHP进制相互转换计算实现步骤
- 知识蒸馏论文翻译(5)—— Feature Normalized Knowledge Distillation for Image Classification(图像分类)
- 弘辽科技:多多进宝有哪些优势?
- 管理高效优秀团队的,都懂这3条天规,请静下心感悟!
- NN和KNN的简单概念
- 启动http报错AH00558:Could not reliably determine the server‘s fully qualified domain name using解决办法
- 飞康SDS转型!成功者的姿势Get
- 我们计划招收300位生信人,免费攻读发论文技巧!
- MySQL索引B+数(超级好看,一看就懂!!!)