转载请注明来源 https://blog.csdn.net/u011453163/article/details/84655641

话不多说,先上效果图

代码是用kotlin写的,kotlin也是刚学的,写的可能不怎么好。

起因

说说为什么开发这个功能,首先自己公司的项目里用到了悬浮球的功能,以前见到的悬浮球一般是作为快捷入口,有点像狗皮膏药,有时候很烦。一直觉得微信的用户体验很好,微信也用了悬浮球,但是相对克制,给用户选择的空间很大,效果也挺炫的,忍不住也想尝试的开发一个,然后就有了这份代码了。

思路

1、 通过WindowManager 添加两个view,一个是控制器悬浮球,一个是展开页面的载体

fun addFloatingWindow() {if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {if (!Settings.canDrawOverlays(context)) {Log.d("FloatingWindow", "没有悬浮窗权限")return}}if (!isAddView) {isAddView = truewindowManager?.apply {addView(floatingBaseView, baseLayoutParams)addView(controller, controlLayoutParams)}}}

kotlin 没有高亮。。。。
这里只是做了简单的权限判断,实际应用到项目中,权限自行管理即可

2、通过切换WindowManager.LayoutParams 的 flag 来改变两个view的焦点问题

    baseLayoutParams?.flags = WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODALcontrolLayoutParams?.flags = WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE or WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE

关于flag网上已经有很多文章写的很明白了 这里就不赘述了,这里之所以要切换焦点,使用底层的view是全屏的且一直存在的,如果不切换焦点的话,触摸事件无法传递。

3、缩放效果
3.1、 最开始的想法是通过改变WindowManager.LayoutParams的宽高来处理的,但是在window上使用动画,总是出现掉帧,达不到效果
3.2、第二种也是为什么我要使用两层的原因,我使用view来做这个动画效果,使用view做缩放动画有两种方式 :一 、canvas.clip(…) 无法消除锯齿(放弃) 二、使用paint的Xfermod来处理 能消除锯齿(采用)

  private fun init() {pathRect = Path()pathCircle = Path()paint = Paint().apply {xfermode=PorterDuffXfermode(PorterDuff.Mode.DST_OUT)isAntiAlias = true}}override fun draw(canvas: Canvas) {canvas.saveLayer(0f, 0f, this.width.toFloat(), this.height.toFloat(), null, Canvas.ALL_SAVE_FLAG)super.draw(canvas)/*** 取路径区域重叠的部分*/canvas.drawFilter = PaintFlagsDrawFilter(0, Paint.ANTI_ALIAS_FLAG or Paint.FILTER_BITMAP_FLAG)pathRect?.reset()pathRect?.addRect(0f, 0f, width.toFloat(), height.toFloat(), Path.Direction.CW)pathCircle?.reset()pathCircle?.addCircle(circleX.toFloat(), circleY.toFloat(), circleRadius.toFloat(), Path.Direction.CW)pathRect?.op(pathCircle, Path.Op.XOR)canvas.drawPath(pathRect, paint)}

4、移除区域
因为是两层的关系 ,所以做移除区域就很简单,只要底层画出相应的块即可。

  override fun onDraw(canvas: Canvas?) {super.onDraw(canvas)canvas?.apply {drawFilter = pfilterif (showDelArea) {paint.color = delAreaBgColorif (isInside) {drawCircle(width.toFloat(), height.toFloat(), delRadius.toFloat(), paint)} else {drawCircle(width.toFloat(), height.toFloat(), srcRadius.toFloat(), paint)}paint.color = delTextColorpaint.getTextBounds(delText, 0, delText.length, textRect)drawText(delText, width.toFloat() - (srcRadius-textRect.width())/2-textRect.width(), height.toFloat() -(srcRadius-textRect.height())/2, paint)}}}

Demo
github源码
FloatingView

如何引入
在项目根 build.gradle 添加

allprojects {repositories {...maven { url 'https://jitpack.io' }}
}

在使用的模块下添加

dependencies {implementation 'com.github.zhenbinwei:KotlinFloatingView:1.0.0'
}

需要使用的权限

<!-- 显示系统窗口权限 -->
<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW"/>
<!-- 在 屏幕最顶部显示addview-->
<uses-permission android:name="android.permission.SYSTEM_OVERLAY_WINDOW" />

如何使用

//创建实例对象
FloatingWindow  floatingWindow=new FloatingWindow(this);
//设置展开的布局
floatingWindow.addRealContentView(View.inflate(this,R.layout.test,null));
//设置悬浮窗图标
floatingWindow.setMiniWindowIcon(R.mipmap.ic_launcher_round);
//显示
floatingWindow.addFloatingWindow();
//关闭
floatingWindow.removeFloatingWindow();

仿微信悬浮窗,可缩放悬浮窗,支持自定义展开布局相关推荐

  1. Android仿微信发送语音消息动态提示,支持上滑取消发送

    Android仿微信发送语音消息动态提示,支持上滑取消发送 先来几张图说明一下,简单直接: 是不是看了图片就秒懂 了. 下面来分析代码实现,直接撸代码. 主页面 AudioSendActivity.j ...

  2. 【DevPress】V2.5.2版本发布,悬浮窗设置及热门标签支持自定义配置,发布文章可同步到稀土掘金平台

    DevPress V2.5.2 版本上线的主要功能为: 一.悬浮窗支持配置管理 二.热门标签支持自定义配置 三.发布文章可同步到稀土掘金和知乎平台 四.其他优化 一.悬浮窗支持配置管理 管理员可在社区 ...

  3. uniapp微信小程序图片裁剪插件,支持自定义尺寸、定点等比例缩放、拖动、图片翻转、剪切圆形/圆角图片、定制样式

    qf-image-cropper2.0 图片裁剪插件 1.效果预览: 2.平台支持: 1.支持微信小程序(移动端.PC端.开发者工具) 2.H5平台(2.1.0版本起) 3. 支持APP平台(2.1. ...

  4. Compose版来啦,高仿微信朋友圈大图缩放、切换、预览功能

    最近在学习Jetpack Compose,想着能否用Jetpack Compose实现微信一些重要界面以及功能.好消息是已经实现了微信聊天界面相关功能以及交互,最近又搞了搞朋友圈的整体交互,网上看了看 ...

  5. 仿微信QQ查看大图缩放动画

    今天来写一篇关于点击小图查看大图的缩放动画的文章,效果图如下所示: 先来讲一下实现的思路:看到这个效果图,想都不用想就知道用属性动画或者补间动画通过缩放.位移.改变透明度来实现.首先点击小图会跳转到另 ...

  6. 微信小程序新增推广功能,支持自定义关键词

    为方便用户找到所需小程序,并帮助小程序更准确地触达用户,微信小程序向开发者提供了自定义关键词的功能.小程序后台新增推广功能,支持开发者添加与业务相关的自定义关键词.开发者可在小程序后台的 " ...

  7. 模仿微信朋友圈 图片浏览 js javascript 支持图片预览,滑动切换,双指缩放,图片缓存

    模仿微信朋友圈 图片浏览 js javascript 支持图片预览,滑动切换,双指缩放,图片缓存 2017年08月10日 12:11:38 阅读数:2311 previewImage-mobile 仿 ...

  8. Android仿微信朋友圈6之实现消息提醒功能

    之前有朋友问我消息提醒咋实现,我一直没有整理出来,今天就放出来.微信朋友圈的消息提醒就是收到朋友的评论后背景底部显示消息条数和评论用户,顶部是一张相册背景和当前用户昵称头像. 1.消息提醒的布局如下: ...

  9. iOS 仿微信相册选择照片imagePicker(Swift) 序号 预览缩略图

    序:微信最新版,选择照片控件细节有所改变,一般有轮子我是不会从新造的 .产品要求一模一样,无奈重新写.调查了一下,GitHub大部分仿微信imagePicker还是基于TZImagePicker,sw ...

最新文章

  1. 互联网协议 — BGP 边界网关协议 — Overview
  2. AI:2020年6月23日北京智源大会演讲分享之智能信息检索与挖掘专题论坛——09:55-10:40刘兵教授《Open-World AI and Continual Learning》
  3. 里氏替换原则→类型转换
  4. linux下安装虚拟天文馆,如何在Ubuntu 20.04、18.04中安装Stellarium 0.20.0虚拟天文馆
  5. makemid+matlab,《MATLAB基础》双语课
  6. sql server和mysql的区别是什么
  7. Wamp升级php到7.3版本
  8. 改变定时器获取传感器频度_称重传感器在高速定量分装系统的应用
  9. GitHub趋势:Vue.js大有超过TensorFlow之势!
  10. 如何套用模板绘制生产管理流程图
  11. redis list放入对象_Redis从入门到入土:详细讲解内存模型以及常用命令
  12. Tricks(三十一)—— 访问一个数组相邻的奇数位偶数位
  13. 基于PHP实现高性能敏感词过滤算法
  14. C#学习(十一)——IntPtr类型
  15. SQL2014 MySQL_SQL Server 2014 Express 官方免费版下载
  16. IDM6.31注册机
  17. PHP(阿里云短信验证码)
  18. 2019软科【世界一流计算机学科排名】公布!
  19. 电商产品设计:如何设计产品分销体系
  20. 使用PMOS管构建电源延时供电电路

热门文章

  1. [Python] 经济赔偿金算法
  2. android11SystemUI之状态栏
  3. 小鱼易连宣布完成1.25亿B轮融资
  4. Access把每一天的数据累加_微软“杀”不死的数据库软件
  5. Java中PDF类如合同打印代码事例
  6. 锐龙r54600虚拟linux,锐龙r5 4600相当于酷睿多少
  7. unity3d的日历控件
  8. [附源码]Python计算机毕业设计茶叶产品质量安全可追溯系统
  9. C语言随机生成连连看地图,MFC实现连连看游戏之地图显示
  10. 安装ssd后不识别网卡_翻车了?安装固态硬盘后不识别的原因和解决方法