<com.example.notepad2.DragFloatActionButton

android:id=“@+id/fb”

android:layout_height=“wrap_content”

android:layout_width=“wrap_content”

app:borderWidth=“0dp”

app:backgroundTint=“#FFFFFF”

app:rippleColor=“#008577”

android:src=“@drawable/hao”

android:layout_alignParentRight=“true”

android:layout_centerVertical=“true”

/>

[](()实现自定义悬浮按钮


创建一个_DragFloatActionButton_类继承_FloatingActionButton_

在类中覆写 onTouchEvent 函数,捕捉触摸事件,然后利用_setX()_,setY() 方法将其移动。

而吸附效果,则是利用_ObjectAnimator.ofFloat_ 实现动画。

//左吸附

ObjectAnimator oa=ObjectAnimator.ofFloat(this,“x”,getX(),0);

oa.setInterpolator(new DecelerateInterpolator());

oa.setDuration(500);

oa.start();

使用的构造方法为

public static ObjectAnimator ofFloat(Object target, String propertyName, float… values)

  • 第一个参数为添加动画的对象

  • 第二个参数为动画属性名称,这里我们使用alpha透明度动画

  • 第三个参数为要改变的值,是可变的,这里我们从1变为0再变为1,也就是从不透明变成透明,然后变回来。

以下是 DragFloatActionButton 类的实现代码:

public class DragFloatActionButton extends FloatingActionButton {

private int parentHeight;

private int parentWidth;

public DragFloatActionButton(Context context) 《Android学习笔记总结+最新移动架构视频+大厂安卓面试真题+项目实战源码讲义》无偿开源 徽信搜索公众号【编程进阶路】 {

super(context);

}

public DragFloatActionButton(Context context, AttributeSet attrs) {

super(context, attrs);

}

public DragFloatActionButton(Context context, AttributeSet attrs, int defStyleAttr) {

super(context, attrs, defStyleAttr);

}

private int lastX;

private int lastY;

private boolean isDrag;

@Override

public boolean onTouchEvent(MotionEvent event) {

int rawX = (int) event.getRawX();

int rawY = (int) event.getRawY();

switch (event.getAction() & MotionEvent.ACTION_MASK) {

case MotionEvent.ACTION_DOWN:

setPressed(true);

isDrag=false;

getParent().requestDisallowInterceptTouchEvent(true);

lastX=rawX;

lastY=rawY;

ViewGroup parent;

if(getParent()!=null){

parent= (ViewGroup) getParent();

parentHeight=parent.getHeight();

parentWidth=parent.getWidth();

}

break;

case MotionEvent.ACTION_MOVE:

if(parentHeight<=0||parentWidth==0){

isDrag=false;

break;

}else {

isDrag=true;

}

//计算手指移动了多少

int dx=rawX-lastX;

int dy=rawY-lastY;

//这里修复一些华为手机无法触发点击事件

int distance= (int) Math.sqrt(dxdx+dydy);

if(distance==0){

isDrag=false;

break;

}

float x=getX()+dx;

float y=getY()+dy;

//检测是否到达边缘 左上右下

x=x<0?0:x>parentWidth-getWidth()?parentWidth-getWidth():x;

y=getY()<0?0:getY()+getHeight()>parentHeight?parentHeight-getHeight():y;

setX(x);

setY(y);

lastX=rawX;

lastY=rawY;

Log.i(“aa”,“isDrag=”+isDrag+“getX=”+getX()+“;getY=”+getY()+“;parentWidth=”+parentWidth);

break;

case MotionEvent.ACTION_UP:

if(!isNotDrag()){

//恢复按压效果

setPressed(false);

//Log.i(“getX=”+getX()+“;screenWidthHalf=”+screenWidthHalf);

/* animate().setInterpolator(new DecelerateInterpolator())

.setDuration(500)

.start();*/

if(rawX>=parentWidth/2){

//靠右吸附

animate().setInterpolator(new DecelerateInterpolator())

.setDuration(500)

.xBy(parentWidth-getWidth()-getX())

.start();

}else {

//靠左吸附

ObjectAnimator oa=ObjectAnimator.ofFloat(this,“x”,getX(),0);

oa.setInterpolator(new DecelerateInterpolator());

oa.setDuration(500);

oa.start();

}

}

break;

}

//如果是拖拽则消s耗事件,否则正常传递即可。

return !isNotDrag() || super.onTouchEvent(event);

Android自定义可移动悬浮按钮相关推荐

  1. Android自定义可移动悬浮按钮,附大厂真题面经

    android:layout_width="wrap_content" app:borderWidth="0dp" app:backgroundTint=&qu ...

  2. 直播商城开发Android自定义可移动悬浮按钮

    在布局文件添加控件时可使用如下方式: <android.support.design.widget.FloatingActionButton......./> 也可使用自定义的包名: co ...

  3. android布局黑色字体颜色,Android开发之FloatingActionButton悬浮按钮基本使用、字体、颜色用法示例...

    本文实例讲述了Android开发之FloatingActionButton悬浮按钮基本使用.字体.颜色用法.分享给大家供大家参考,具体如下: 这里主要讲: FloatingActionsMenu自定义 ...

  4. Android自定义View-滑动解锁按钮

    Android自定义View-滑动解锁按钮 写在前面 一.实现的思路 二.先上成品图 三.自定义属性 四.使用 五.具体实现 写在前面 最近由于项目需求,需要有一个类似苹果的滑动解锁控件,抱着万事不求 ...

  5. android设置自定义按钮,Android自定义View之元素按钮

    Android自定义View之元素按钮 之前在dribbble看到的三个元素的按钮,参考了设计的创意,添加了自己定义的动画效果来实现.先看效果 效果图 分别是水火电三个元素的按钮实现.其中电的实现最简 ...

  6. android悬浮功能实现,Android实现系统级悬浮按钮

    本文实例为大家分享了Android系统级悬浮按钮的具体代码,供大家参考,具体内容如下 具体的需求 1.就是做一个系统级的悬浮按钮,就像iPhone 桌面的那个悬浮按钮效果一样,能随意拖动,并且手一放开 ...

  7. Android 可拖拽悬浮按钮

    转自http://www.jianshu.com/p/ba3e5fc5cff1 实现思路 通过重写控件的onTouchEvent方法监听触摸效果. 通过View的setX()和setY()方法实现移动 ...

  8. Android自定义弹窗——右上角悬浮关闭

    今天打开QQ音乐时,看到更新界面右上角悬浮关闭按钮,本来想应该挺简单的,于是就想顺手写一个,但是不试不知道,一试就出问题咯. 于是在原有自己封装的dialog中进行修改,原有样式 本来以为只要加个ma ...

  9. android自定义adapter(实现对按钮的监听)

    我们一般需要自定义adapter   这里就需要继承BaseAdapter adapter在MVC开发模式中,是控制层 baseAdapter  继承这个方法必须重写 四个方法 1.  getcont ...

最新文章

  1. 求求你,不要再使用!=null判空了!
  2. 【bzoj1565】[NOI2009]植物大战僵尸 拓扑排序+最大权闭合图
  3. Python中的range和xrange区别
  4. 栈(stack)和堆(heap)
  5. 如何把html转换成音频网址,怎么把视频转换成音频 视频转换成mp3
  6. Linux crypto相关知识的汇总 Linux加密框架crypto对称算法和哈希算法加密模式
  7. nginx的源码编译及相关文件配置
  8. mssql sqlserver 使用sql脚本检测数据表中一列数据是否连续的方法分享
  9. weblogic系列漏洞整理 -- 1. weblogic安装
  10. 跟着鬼哥学爬虫-2-糗事百科
  11. iNet Network Scanner Mac(网络扫描工具)
  12. Codeforces1538G Gift Set (三分)
  13. 多目标灰太狼算法求解环境经济调度问题(IEEE30)(Matlab实现)
  14. 网名接龙--之追求完美
  15. 阿里云服务器试用一哈
  16. 提示用户输入一个高考_高考报名用户名密码显示错误怎么办
  17. 30个不可不知的容器技术工具和资源
  18. spring中的JdbcTemplate的使用方法
  19. 文件夹下的图片名字进行重命名--批量操作
  20. 微信小程序海报分享及好友分享

热门文章

  1. 数据结构之ArrayList实现杨辉三角
  2. 史上最污技术解读,我竟然秒懂了!
  3. Zookeeper 入门学习
  4. [Android应用]《幽默笑话》V2.0 正式版震撼发布!
  5. 世界上用户最多的两大星球丨腾讯赚钱花钱!脸谱道歉道歉!
  6. infopath2013,重复表序号自动递增
  7. Windows Vista下载地址
  8. 红米二代竟有四款!64位/八核/5.5英寸
  9. 计算机仿真实验报告实验原理简述,计算机仿真期末作业实验报告
  10. 简单的电脑程序{ 自动关机! }