目录

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

WindowManager 官方文档说明

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 悬浮窗功能实现(微信语音通话悬浮窗效果实现)相关推荐

  1. android 仿微信来电_Android 悬浮窗功能实现(微信语音通话悬浮窗效果实现)

    目录 1.基本介绍 2.代码示例 3.实现效果及便捷工具类 4.仿微信语音通话悬浮窗效果实现 4.1 需求分析及效果展示 4.2 实现 5.最后 1.基本介绍 Android 界面绘制都是通过 Win ...

  2. android 微信缩小通话界面_Android 悬浮窗功能实现(微信语音通话悬浮窗效果实现)...

    1.基本介绍 Android 界面绘制都是通过 WindowManager 对象可通过获取 WINDOW_SERVICE 系统服务得到,并因为 WindowManager 继承于 ViewManage ...

  3. 一个Android平台下的仿微信视频聊天悬浮窗

    闲来无事想自己手写一个类似微信视频聊天悬浮窗的效果,由于笔者是第一次写技术类的文章,不足的地方,还请各位多多谅解哈.另外由于篇幅有限,在此只展示关键代码.首先我们定义二个按钮,一个是创建悬浮窗,一个是 ...

  4. Android利用MedioRecorder使用仿微信语音录音以及播放(总结)

    今天模仿着微信的发送语音功能做了一下,现将步骤以及其中遇到的问题记录一下,以便以后查看. 实现功能:1.录制语音并显示到列表中:2.点击列表中的语音自动进行播放:3.录制语音时以及播放语音时的动画效果 ...

  5. Android自定义View分享——仿微信朋友圈图片合并效果

    写在前面 笔者近来在学习Android自定义View,收集了一些不算复杂但又"长得"还可以的自定义View效果实现,之前分享过两个效果:一个水平的进度条,一个圆形温度显示器,如果你 ...

  6. js模仿微信语音播放的动画效果

    设计思路: 播放时使用js的setInterval来替换png达到动画效果 当前demo语音播放使用插件BenzAMRRecorder.js 如需要用其它js插件来播放语音也很容易集成到本demo 准 ...

  7. android仿2016年春节微信朋友圈红包照片效果

    项目地址:https://github.com/leibnik/BribeImageView

  8. 地表最强之Android微信语音/腾讯会议通话录音

    前言 说话这个功能前前后后倒腾很久了,一开始是在小米手机上看到这个功能的,使用系统自带录音机 就能录下微信语音通话双方声音,再对比了其它手机都没有这个功能,瞬间觉得很牛皮.那我胡汉三 肯定是要来搞一哈 ...

  9. android按住录音按钮_Android实现录音方法(仿微信语音、麦克风录音、发送语音、解决5.0以上BUG)...

    先给大家展示下效果图,如果大家感觉不错,请参考使用方法, 效果图如下所示: 使用方法: 录音工具类:AudioRecoderUtils.java,代码如下: public class AudioRec ...

最新文章

  1. 如何画出高级酷炫的神经网络图?优秀程序员都用了这几个工具
  2. 【USACO 3.1】Score Inflation(完全背包)
  3. 深入浅出CSS(二):关于雪碧图、background-position与steps函数的三角恋情
  4. 结对作业2:单元测试
  5. linux怎么添加中文服务器,linux不支持中文怎么办_网站服务器运行维护
  6. php6 配置,thinkphp6下载安装与配置图文详细讲解教程(composer下载安装)
  7. jenkins教程菜鸟_jenkins新手入门教程
  8. opendrive中的Lanes
  9. 可怕的pyspider猫途鹰
  10. c语言顺序比较法字符,常用C语言排序算法解析
  11. Transformer(李宏毅2022)
  12. c语言自学报告格式,C语言程序设计实验报告优秀范文
  13. Java小游戏中加背景音乐--有图有真相
  14. [HttpServlet] Error occured when handling uri: /cat/s/router
  15. 如何防止网站关键数据被人恶意采集
  16. 【PLC编程】西门子工艺对象 – 连续控制器CONT_C的使用
  17. 智能镜子制作_更智能的镜子及其制作方法
  18. CTP报单交易指令(一)限价单
  19. 【量化课堂】kd 树算法之详细篇 【1002 消化第一次ojbk】
  20. 用python的turtle库画QQ表情

热门文章

  1. Sqoop的基本使用
  2. 幂等性问题以及处理方法
  3. 处理接口幂等性的两种常见方案
  4. 编译期 java.lang.IllegalArgumentException
  5. 电脑系统重装怎么找回文件 重装系统文件怎么找回来
  6. MFC CFile 读写文件
  7. 灾难-NAS服务器用的西数红盘报警处理
  8. 嵌入式开发中的英文词汇log
  9. 基于VB.Net的图书馆管理系统的设计与实现(用户登录界面)
  10. 计算机程序的灵魂,算法——抓住程序的灵魂