悬浮View,应用内悬浮

本章给大家介绍自定义悬浮View,可随手指拖动,手指放开后会自动吸附到手机屏边缘,悬浮View内的Content布局可以任意放入自定义的布局,非常方便。

效果图:

核心部分是手指触摸事件处理,自定义View通过重写OnTouchEvent事件进行处理:

 @Overridepublic boolean onTouchEvent(MotionEvent ev) {if (!mScrollEnable) return super.onTouchEvent(ev);switch (ev.getAction()) {case MotionEvent.ACTION_DOWN:clickDownX = ev.getX();clickDownY = ev.getY();clickDownTime = System.currentTimeMillis();mX = ev.getX();mY = ev.getY();super.onTouchEvent(ev);return true;case MotionEvent.ACTION_MOVE:int scaledTouchSlop = ViewConfiguration.get(getContext()).getScaledTouchSlop();float x = ev.getX();float y = ev.getY();x = x - mX;y = y - mY;if (Math.abs(scaledTouchSlop) < Math.abs(x) || Math.abs(scaledTouchSlop) < Math.abs(y)) {isScroll = true;}if (isScroll) {mScrollLeft = (int) (getX() + x);mScrollTop = (int) (getY() + y);mScrollRight = (int) (getX() + getWidth() + x);mScrollBottom = (int) (getY() + getHeight() + y);//防止滑出父界面if (mScrollLeft < 0 || mScrollRight > mParentWidth) {mScrollLeft = (int) getX();mScrollRight = (int) getX() + getWidth();}if (mScrollTop < 0 || mScrollBottom > mParentHeight) {mScrollTop = (int) getY();mScrollBottom = (int) getY() + getHeight();}layout(mScrollLeft, mScrollTop, mScrollRight, mScrollBottom);hasScroll = true;return true;}break;case MotionEvent.ACTION_UP:case MotionEvent.ACTION_CANCEL:clickUpX = ev.getX();clickUpY = ev.getY();clickUpTime = System.currentTimeMillis();float stanceX = clickUpX - clickDownX;float stanceY = clickUpY - clickDownY;if(stanceX < 0){stanceX = stanceX * -1;}if(stanceY < 0){stanceY = stanceY * -1;}if((clickUpTime - clickDownTime) < 150 && stanceX < 50 && stanceY < 50){if(onClickListener!=null){onClickListener.onClick();}}if (isScroll) {isScroll = false;setPressed(false);//重置点击状态if (isAdsorb) {//判断是否开启吸附//获取屏幕中间值int mind = getScreenWidth() / 2;//获取控件宽度的中间值int viewWithMind = getWidth() / 2;//手指抬起时 自动吸附到屏幕两边if (mScrollLeft + viewWithMind > mind) {mScrollRight = getScreenWidth();mScrollLeft = getScreenWidth() - getWidth();} else {mScrollRight = getWidth();mScrollLeft = 0;}layout(mScrollLeft, mScrollTop, mScrollRight, mScrollBottom);}return true;}break;}return super.onTouchEvent(ev);}
  • 核心介绍

这里大概说一下,主要是MOVE操作,记录下手指的坐标,通过layout()方法重新给View定义新的位置,这里是通过计算到View的左右上下边距实现,和矩阵的思路是一样的。当然也可以改成矩阵实现,也可以通过x,y具体坐标去实现。方法多种哈。

  • 吸附
    主要是手指抬起后(ACTION_UP、ACTION_CANCEL),先去判断控件处于什么位置,拿到屏幕的宽度,看是在屏幕的左半边还是右半边,然后进行动画移动。左边的坐标自然是0,右边是(屏幕宽度-控件的宽度),然后进行动画移动重新布局。

  • 踩过的坑
    一开始用的吸附是这样做的:

DragView.this.animate().setInterpolator(new BounceInterpolator()).setDuration(0).x(0).y(realY).start();

相信做过的人都不陌生,但是这样做是存在问题的。在一些情况下,里面的布局刷新或者重新绘制,这个吸附就会出现位置错误的情况,后来才改成另一种实现方式。同样遇到这样的问题的可参考本文实现。

  • 注意事项
    这里要注意ACTION_UP、ACTION_CANCEL这两个操作事件,因为部分手机手指抬起后是走的ACTION_CANCEL,部分是ACTION_UP,所以最好都做一下逻辑处理。

  • 具体调用方法

    大致就是LayoutInflater实例化出ContentView,然后DolinDragView.setContentView()方法将控件放入。
    我这里做的Demo里面是一个轮播图,所以还有别的逻辑,需要的朋友可以去我主页资源处下载完整Demo。

DEMO地址

悬浮View,可拖动,放手后自动吸附到屏幕边上。相关推荐

  1. android吸附菜单,Android RecycleView实现滑动停止后自动吸附效果

    Android RecycleView实现滑动停止后自动吸附效果 发布时间:2020-11-02 16:01:42 来源:亿速云 阅读:124 作者:Leah 这篇文章将为大家详细讲解有关Androi ...

  2. 原生Android 极光推送收到通知后自动点亮屏幕

    1.新增屏幕唤醒权限 <uses-permission android:name="android.permission.WAKE_LOCK" /> 2.集成极光sdk ...

  3. 轮播图功能的全实现(自动播放、小点点、按住停止播放、放手后开始播放...)

    MainActivity /*** 1.实现了轮播图自动滚动效果<br>* 2.设置了跟随页面变化的小点点<br>* 3.解决了轮播图手指滑动后,显示页面错位的问题<br ...

  4. qt弹出框自动消失的悬浮提示框_QT【简单自定义弹出提示框】:非模态,数秒后自动消失...

    目标效果:一个提示信息框,创建后显示提示信息,一定时间后自动消失,不阻塞原来窗口. 思路: 自定义一个控件,继承自QWidget,构造时设置定时器,时间到则自我销毁. ### 实现代码 代码一共两个文 ...

  5. android悬浮窗组件,Android 悬浮窗,悬浮view功能实现

    写在前面:本文仅个人开发时遇到的问题及个人解决办法的记录. 国内各个手机厂商对ROM魔改的比较严重,还没有做兼容性测试,所以碰到沙雕的机子的时候,请再去寻找适配方法 最近项目开发中,需要实现一个悬浮窗 ...

  6. 【音频处理】Melodyne 选择工具使用 ( 主工具简介 | 修改音高 | 自动吸附 | 音符长度修改 | 长度自动吸附 | 设置音符分离线 | 设置片段分离线 )

    文章目录 一.主工具简介 二.选择工具 | 修改音高 三.自动吸附 四.修改音符长度 五.修改音符长度自动吸附 六.音符分离线设置 七.设置片段分离线 一.主工具简介 主工具 是 主工具栏 中的 66 ...

  7. JS 拖拽对齐参考线+自动吸附+对齐到网格

    具体代码参见:https://github.com/yyccmmkk/js-reference-line [需求] 对一个元素进行拖拽时,生成这个组件和其它组件对齐的参考线,实现各组件间四条边及水平中 ...

  8. Android 可滑动的悬浮View

    这种创建悬浮view的前提是获取到了悬浮的权限 <uses-permission android:name="android.permission.SYSTEM_ALERT_WINDO ...

  9. Android实现自动清空,android – 删除图像后自动刷新在gridview中不...

    我正在研究网格视图,我是android的新手.我之前在gridview中遇到了一个问题,我解决了自己发布链接,因为代码与上下文任务中添加的新功能相同 i dont know how to get th ...

最新文章

  1. python接口测试-认识GET请求
  2. SDRAM读写一字(上)
  3. Laravel中的Blade模版
  4. 武汉科技大学计算机研究生拟录取名单,武汉科技大学2021年硕士研究生拟录取名单公示...
  5. java怎么输出liststring_春招|春招实习上岸,分享面筋回报社区(Java、Python)...
  6. mac实用小技巧分享之使Mac快速锁屏与睡眠
  7. 怎么用计算机里的坦克大战,FC经典90坦克大战电脑版
  8. 【C语言经典100题】乒乓球队的比赛
  9. 将指定小程序页面设置为首页的两种方式
  10. java实现rabbitmq_RabbitMQ搭建(2)-Java简单实现
  11. centos 安装Htseq_APPNode管理面板安装使用教材
  12. [Android]天气App 1
  13. 零线和地线接反了会发生什么?
  14. Nginx反向代理与系统参数配置conf
  15. 为什么A能ping通B,B不能ping通A?
  16. R语言实现灰色预测模型gm11
  17. 【原创】车床操作点滴-不断更新
  18. 利用Arduino uno控制24BYJ-48电机正反转停止( 不使用步进库实现方法二)
  19. 聊聊关于创业公司招聘技术负责人
  20. 怎样删除数组中重复元素

热门文章

  1. Strategy模式的具体实现
  2. 哈希表——高效率的利器
  3. Pattern与Matcher
  4. ubuntu1804系统设置在哪里_ubuntu1804安装后设置
  5. 鄢陵一高2021高考成绩查询单,鄢陵县第一高级中学2020年高考喜报
  6. 初探数通网络开放可编程简介
  7. html读秒倒计时,jQuery实现读秒倒计时
  8. 水火不容?研发人员也是产品经理!
  9. 手把手教你从零写一个日志框架
  10. 机器学习:案例探究课程笔记