在最近的项目开发过程中,产品提出了一个需求,就是要求在屏幕上面有一个悬浮按钮,然后手势可以拖动,在手抬起的时候会回到屏幕边缘,类似于苹果的虚拟home键。
不多说了,直接上代码了,代码里面会有注释,可以解释清楚:整个Demo只有一个类,继承FloatingActionButton:
import android.animation.ObjectAnimator;
import android.content.Context;
import android.support.design.widget.FloatingActionButton;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.view.animation.DecelerateInterpolator;import com.rhzt.xgj.util.DisplayUtil;/*** Created by lixuce on 2017/5/8.*/public class DragFloatActionButton extends FloatingActionButton {private int screenWidth;private int screenHeight;private int screenWidthHalf;private int statusHeight;public DragFloatActionButton(Context context) {super(context);init();}public DragFloatActionButton(Context context, AttributeSet attrs) {super(context, attrs);init();}public DragFloatActionButton(Context context, AttributeSet attrs, int defStyleAttr) {super(context, attrs, defStyleAttr);init();}private void init(){//获取屏幕宽screenWidth= DisplayUtil.getScreenWidth(getContext());screenWidthHalf=screenWidth/2;//屏幕的高screenHeight=DisplayUtil.getScreenHight(getContext());//状态栏的高度// 如果状态栏可以拖动    就获取状态栏的高度   目前设置成0statusHeight=0;}private int lastX;private int lastY;private boolean isDrag;@Overridepublic boolean onTouchEvent(MotionEvent event) {int rawX = (int) event.getRawX();int rawY = (int) event.getRawY();switch (event.getAction() & MotionEvent.ACTION_MASK) {case MotionEvent.ACTION_DOWN:isDrag=false;getParent().requestDisallowInterceptTouchEvent(true);lastX=rawX;lastY=rawY;break;case MotionEvent.ACTION_MOVE:isDrag=true;//计算手指移动了多少int dx=rawX-lastX;int dy=rawY-lastY;//这里修复一些华为手机无法触发点击事件的问题int distance= (int) Math.sqrt(dx*dx+dy*dy);if(distance==0){isDrag=false;break;}float x=getX()+dx;float y=getY()+dy;//检测是否到达边缘 左上右下x=x<0?0:x>screenWidth-getWidth()?screenWidth-getWidth():x;y=y<statusHeight?statusHeight:y+getHeight()>screenHeight?screenHeight-getHeight():y;setX(x);setY(y);lastX=rawX;lastY=rawY;//Log.i("getX="+getX()+";getY="+getY()+";screenHeight="+screenHeight);break;case MotionEvent.ACTION_UP:if(isDrag){//恢复按压效果setPressed(false);
//                    Log.i("getX="+getX()+";screenWidthHalf="+screenWidthHalf);if(rawX>=screenWidthHalf){animate().setInterpolator(new DecelerateInterpolator()).setDuration(500).xBy(screenWidth-getWidth()-getX()).start();}else {ObjectAnimator oa=ObjectAnimator.ofFloat(this,"x",getX(),0);oa.setInterpolator(new DecelerateInterpolator());oa.setDuration(500);oa.start();}}break;}//如果是拖拽则消耗事件,否则正常传递即可。你return isDrag || super.onTouchEvent(event);}
}
很简单就可以实现效果了,代码是应对我的需求来写的,你也可以自己来写,只是一个思路,希望可以帮到你。

高仿苹果虚拟home键,手势拖动,放手会弹到屏幕边缘。相关推荐

  1. 小马哥--高仿苹果7p 主板型号9900-875AQ0-A 真实6571芯片刷机拆机主板与开机界面图

    高仿苹果7与7p截止目前遇到的版本很多  其中A8232  JD系列的7与7p  A系列和Q系列    9900系列的版本等等 其中有6571  6582  6735等等芯片  有真2G运存高配机型 ...

  2. 小马哥----高仿苹果5se 机型界面图面面观,低配机型 谨防假冒

    遇到的这款高仿苹果5se 主板芯片为6572 nand字库 整机连接手机调换到内存卡模式.只有12m 坑爹的山寨 上图拆机图与整机前后图

  3. 小马哥----高仿苹果6S A236 刷机拆机主板图与开机界面图 更新解锁界面 全网通4G 警惕

    高仿苹果的版本较多 A系列   R系列    LT系列    Q系列  TD系列  S系列 等等机型版本 刷机建议要拆机看主板型号来救砖 LT系列的有LT6082     LT6000V     LT ...

  4. 小马哥---高仿苹果6 R7226刷机拆机主板图与开机识别图 修改WiFi信号增强

    高仿苹果6与6s  6sp系列版本较多  截止目前遇到的多达几十种 其中A系列的  如A233  A231 A235  A236新版与旧版系列的如A192 A193 A185 A175等等 R系列   ...

  5. 小马哥----高仿苹果6S A235刷机拆机图与开机界面图 真八核6735芯片 精仿系列机

    高仿苹果的版本较多 A系列   R系列    LT系列    Q系列  TD系列  S系列 等等机型版本 刷机建议要拆机看主板型号来救砖 LT系列的有LT6082     LT6000V     LT ...

  6. 小马哥----高仿苹果6s 主板型号S106s 更换内核 刷机拆机主板图与开机识别图

    高仿苹果系列版本较多 S106 系列有s106  s106L S106F等版本 这次说明的是S106s的版本机型 S106s与s106相比来说 明显的主板与做工很差  主板就可以对比出来 而且分日期版 ...

  7. 小马哥---山寨高仿苹果x 主板型号s306 机型图示展示

    苹果x发布会不久.市场已经出现高仿苹果x版本欲购买苹果x的网友 谨记走正规渠道购买.避免贪小便宜购买到假货.吃亏上当 正品苹果x 售价万元.购买到假货 损失就大了 最近遇到一款山寨苹果x版本 拍图与网 ...

  8. 小马哥----高仿苹果6 主板型号LT6082 芯片6582 真2g运存 15年新版山寨机型

    高仿苹果的版本较多 A系列   R系列    LT系列    Q系列  TD系列  S系列 等等机型版本 刷机建议要拆机看主板型号来救砖 此次展示的是LT系列中的LT6082机型版本 这种系列的有LT ...

  9. 小马哥---高仿苹果6p 主板型号Q33-qhd 刷机拆机主板图与开机界面图 与Q33-hd主板对比差别图

    高仿苹果版本较多 此次展示的是主板型号为Q33-qhd的机型 Q33系列分Q33-qhd与Q33 -hd两个版本.机型屏幕硬件不同   刷错资料花屏 芯片都是6582 主要区别拆机看主板标示贴 上图

最新文章

  1. [Android问答] 开发环境问题集锦
  2. 【学员分享】程序员效率神器,最常用VIM插件安装大全
  3. android头部固定悬停,Android开发上滑悬停且头部可刷新
  4. java二重循环换行_Java零基础系列教程05Java二重循环
  5. 使用 dotnet format 格式化代码
  6. MySQL提示The server quit without updating PID file问题的解决办法
  7. PyCharm:ModuleNotFoundError: No module named 'selenium'
  8. prim最小生成树算法 邻接表+STL实现
  9. 网络图结构中节点度分布的散点图
  10. 计算机网络原理之网络层(解疑答惑)
  11. 普元eos使用svn_普元EOS开发经验总结——不定期持续更新中
  12. 计算实到人数用计算机也怎么算,商场客流量系统实现准确人数统计-俊竹客流计算器...
  13. 随笔 - 记录下当前的生活
  14. OC - @preperty的一些修饰词
  15. Linux基础知识命令总结1
  16. 五个喜欢点赞图标动画特效(附源码,效果图)
  17. 选择UTON PAD平板,这才是真正的平板电脑,双十二就它了
  18. 在线流程图和思维导图开发技术详解(四)
  19. cnPuTTY CAC 0.78.0.1—PuTTY CAC 0.78中文版本简单说明~~
  20. 设置idea汉化中文

热门文章

  1. android绿豆通讯录xml,Android 数据库(SQLite)【简介、创建、使用(增删改查、事务、实战演练)、数据显示控件(ListView、Adapter、实战演练)】...
  2. 2021-08-15 minikube在阿里云centos系统上的安装实践
  3. SpringMVC_初级总结
  4. 侃一侃人工智能2-零散的人工智能概念
  5. win系统修改C盘下user/用户名
  6. C# 生成图片清晰度问题(转载)
  7. Python第一阶段学习 day14
  8. 图形驱动程序和显卡驱动什么区别_你的安卓机以后也要单独安装显卡驱动程序喽...
  9. 比A100性能高4.5倍!英伟达H100横扫AI推理基准测试
  10. win2003 php5.2.17,win2003下搭建FastCGI+php5.2.17