Android 悬浮窗功能实现(微信语音通话悬浮窗效果实现)
目录
1.基本介绍
2.代码示例
3.实现效果及便捷工具类
4.仿微信语音通话悬浮窗效果实现
4.1 需求分析及效果展示
4.2 实现
5.最后
1.基本介绍
Android 界面绘制都是通过 WindowManager 服务来实现的,WindowManager 对象可通过获取 WINDOW_SERVICE 系统服务得到,并因为 WindowManager 继承于 ViewManager ,所以其拥有以下方法
addView(View view, ViewGroup.LayoutParams params)
主要通过该方法将指定 View 添加到屏幕上,实现悬浮窗效果
( WindowManager 对象调用 addView( ) 入参的 LayoutParams 必须为 WindowManager.LayoutParams )
removeView(View view)
移除指定已添加到屏幕上的 View
updateViewLayout(View view, ViewGroup.LayoutParams params)
通过调整 LayoutParams 更新屏幕上的指定 View
2.代码示例
1)在 AndroidManifest 中声明权限
<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />
2)判断是否拥有在屏幕上层绘制权限
/*** 判断是否拥有悬浮窗权限** @param isApplyAuthorization 是否申请权限*/public static boolean canDrawOverlays(Context context, boolean isApplyAuthorization) {//Android 6.0 以下无需申请权限if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {//判断是否拥有悬浮窗权限,无则跳转悬浮窗权限授权页面if (Settings.canDrawOverlays(context)) {return true;} else {if (isApplyAuthorization) {Intent intent = new Intent(Settings.ACTION_MANAGE_OVERLAY_PERMISSION, Uri.parse("package:" + context.getPackageName()));if (context instanceof Service) {intent.setFlags(FLAG_ACTIVITY_NEW_TASK);}context.startActivity(intent);return false;} else {return false;}}} else {return true;}}
3)获取 WindowManager 对象,生成 WindowManager.LayoutParams ,调用 addView 方法传入指定 View
//获取 WindowManager 服务WindowManager windowManager = (WindowManager) context.getSystemService(WINDOW_SERVICE);//生成 WindowManager.LayoutParams 对象WindowManager.LayoutParams layoutParams = new WindowManager.LayoutParams();//形成的窗口层级关系,Android 8.0 前后存在区别if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {//实现在其他应用和窗口上方显示提醒窗口layoutParams.type = WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY;} else {//表示提供用户交互操作的非应用窗口layoutParams.type = WindowManager.LayoutParams.TYPE_PHONE;}layoutParams.format = PixelFormat.RGBA_8888;//显示位置layoutParams.gravity = Gravity.START | Gravity.TOP;//该flags描述的是窗口的模式,是否可以触摸,可以聚焦等layoutParams.flags = WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL | WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE;//窗口宽高layoutParams.width = LinearLayout.LayoutParams.WRAP_CONTENT;layoutParams.height = LinearLayout.LayoutParams.WRAP_CONTENT;//需要悬浮的指定 ViewView view = LayoutInflater.from(context).inflate(R.layout.widget_test_view, null, false);//将指定 View 添加到屏幕上windowManager.addView(view, layoutParams);
3.实现效果及便捷工具类
MainActivity 代码(Kotlin,点击查看源码)
btn_show_view.setOnClickListener {if (ExampleFloatingService.isStart) {//通知处理点击事件LocalBroadcastManager.getInstance(this).sendBroadcast(Intent(ExampleFloatingService.ACTION_CLICK))} else {if (FloatingWindowHelper.canDrawOverlays(this, true)) {startService(Intent(this, ExampleFloatingService::class.java))}}}
ExampleFloatingService 代码(Kotlin,点击查看源码)
悬浮窗管理服务,一般在此处理业务逻辑
目的脱离 Activity 展示悬浮窗
帮助类 FloatingWindowHelper(Java,点击查看源码)
悬浮窗功能相关操作帮助类,使用示例如下
private lateinit var mFloatingWindowHelper: FloatingWindowHelperprivate lateinit var mExampleViewA: Viewprivate lateinit var mExampleViewB: Viewoverride fun onCreate() {super.onCreate()mFloatingWindowHelper = FloatingWindowHelper(this)val layoutInflater = LayoutInflater.from(this)mExampleViewA = layoutInflater.inflate(R.layout.widget_test_view, null, false)mExampleViewB = layoutInflater.inflate(R.layout.widget_test_view_b, null, false)}private fun onClick() {if (!mFloatingWindowHelper.contains(mExampleViewA)) {//悬浮显示指定 ViewmFloatingWindowHelper.addView(mExampleViewA)} else if (!mFloatingWindowHelper.contains(mExampleViewB)) {//悬浮显示指定 View 在指定位置,并可拖动mFloatingWindowHelper.addView(mExampleViewB, 100, 100, true)} else {//移除所有悬浮 ViewmFloatingWindowHelper.clear()}}override fun onDestroy() {mFloatingWindowHelper.destroy()super.onDestroy()}
4.仿微信语音通话悬浮窗效果实现
4.1 需求分析及效果展示
需求分析:
1.悬浮可拖动
2.自动粘边:停留时只粘在屏幕左边或右边
3.圆直角切换:拖动时悬浮窗四个角为圆角,粘边时粘边处皆为直角
4.2 实现
1.悬浮可拖动
通过 WindowManager addView 实现悬浮效果
通过重写悬浮 View 的 onTouch 方法或为悬浮 View setOnTouchListener 处理触摸事件记录滑动距离,再通过 WindowManager updateViewLayout 方法更新悬浮 View 位置,实现悬浮可拖动效果
2.自动粘边:停留时只粘在屏幕左边或右边
重写悬浮 View 的 onTouch 方法感知触摸事件,当处于触摸移动状态时,更新悬浮 View 四周角为圆角。当触摸抬起时,根据悬浮 View 当前坐标与屏幕宽度值判断位置,然后通过 WindowManager updateViewLayout 方法更新悬浮 View 位置,将悬浮 View 平移到屏幕坐标或右边,实现粘边效果
3.圆直角切换:拖动时悬浮窗四个角为圆角,粘边时粘边处皆为直角
重写悬浮 View 的 onDraw 方法,根据移动方向判断是否需要在左/右边绘制直角矩形覆盖圆角,实现圆直角切换效果
4. 代码示例
自定义悬浮 View (Java,点击查看源码)
调用(Kotlin)
val voiceFloatingView = VoiceFloatingView(context)voiceFloatingView.show()
5.最后
- 源码及 Demo 地址:https://github.com/ziwenL/FloatingWindowDemo
- 如有更好的见解或建议,欢迎留言
Android 悬浮窗功能实现(微信语音通话悬浮窗效果实现)相关推荐
- android 仿微信来电_Android 悬浮窗功能实现(微信语音通话悬浮窗效果实现)
目录 1.基本介绍 2.代码示例 3.实现效果及便捷工具类 4.仿微信语音通话悬浮窗效果实现 4.1 需求分析及效果展示 4.2 实现 5.最后 1.基本介绍 Android 界面绘制都是通过 Win ...
- android 微信缩小通话界面_Android 悬浮窗功能实现(微信语音通话悬浮窗效果实现)...
1.基本介绍 Android 界面绘制都是通过 WindowManager 对象可通过获取 WINDOW_SERVICE 系统服务得到,并因为 WindowManager 继承于 ViewManage ...
- 一个Android平台下的仿微信视频聊天悬浮窗
闲来无事想自己手写一个类似微信视频聊天悬浮窗的效果,由于笔者是第一次写技术类的文章,不足的地方,还请各位多多谅解哈.另外由于篇幅有限,在此只展示关键代码.首先我们定义二个按钮,一个是创建悬浮窗,一个是 ...
- Android利用MedioRecorder使用仿微信语音录音以及播放(总结)
今天模仿着微信的发送语音功能做了一下,现将步骤以及其中遇到的问题记录一下,以便以后查看. 实现功能:1.录制语音并显示到列表中:2.点击列表中的语音自动进行播放:3.录制语音时以及播放语音时的动画效果 ...
- Android自定义View分享——仿微信朋友圈图片合并效果
写在前面 笔者近来在学习Android自定义View,收集了一些不算复杂但又"长得"还可以的自定义View效果实现,之前分享过两个效果:一个水平的进度条,一个圆形温度显示器,如果你 ...
- js模仿微信语音播放的动画效果
设计思路: 播放时使用js的setInterval来替换png达到动画效果 当前demo语音播放使用插件BenzAMRRecorder.js 如需要用其它js插件来播放语音也很容易集成到本demo 准 ...
- android仿2016年春节微信朋友圈红包照片效果
项目地址:https://github.com/leibnik/BribeImageView
- 地表最强之Android微信语音/腾讯会议通话录音
前言 说话这个功能前前后后倒腾很久了,一开始是在小米手机上看到这个功能的,使用系统自带录音机 就能录下微信语音通话双方声音,再对比了其它手机都没有这个功能,瞬间觉得很牛皮.那我胡汉三 肯定是要来搞一哈 ...
- android按住录音按钮_Android实现录音方法(仿微信语音、麦克风录音、发送语音、解决5.0以上BUG)...
先给大家展示下效果图,如果大家感觉不错,请参考使用方法, 效果图如下所示: 使用方法: 录音工具类:AudioRecoderUtils.java,代码如下: public class AudioRec ...
最新文章
- 如何画出高级酷炫的神经网络图?优秀程序员都用了这几个工具
- 【USACO 3.1】Score Inflation(完全背包)
- 深入浅出CSS(二):关于雪碧图、background-position与steps函数的三角恋情
- 结对作业2:单元测试
- linux怎么添加中文服务器,linux不支持中文怎么办_网站服务器运行维护
- php6 配置,thinkphp6下载安装与配置图文详细讲解教程(composer下载安装)
- jenkins教程菜鸟_jenkins新手入门教程
- opendrive中的Lanes
- 可怕的pyspider猫途鹰
- c语言顺序比较法字符,常用C语言排序算法解析
- Transformer(李宏毅2022)
- c语言自学报告格式,C语言程序设计实验报告优秀范文
- Java小游戏中加背景音乐--有图有真相
- [HttpServlet] Error occured when handling uri: /cat/s/router
- 如何防止网站关键数据被人恶意采集
- 【PLC编程】西门子工艺对象 – 连续控制器CONT_C的使用
- 智能镜子制作_更智能的镜子及其制作方法
- CTP报单交易指令(一)限价单
- 【量化课堂】kd 树算法之详细篇 【1002 消化第一次ojbk】
- 用python的turtle库画QQ表情