<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. 基于深度学习的肺癌预测诊断
  2. win7安装omnetpp-4.6
  3. UNIX高级环境编程(9)进程控制(Process Control)- fork,vfork,僵尸进程,wait和waitpid...
  4. 鸿蒙自研系统,华为已注册“华为鸿蒙”商标,自研操作系统最快秋季发布
  5. Android开发——RecyclerView特性以及基本使用方法(二)
  6. python除法函数一般如何命名_关于python:当用于除法时,’/’和’//’之间有什么区别?...
  7. 前端学习(2694):重读vue电商网站15之阻止页签tabs切换
  8. 《人人都是产品经理》读后感
  9. vue delete删除json数组_Vue.set 和 Vue.delete
  10. 用VS.NET 2005制作安装程序
  11. MATLAB 数学应用 微分方程 常微分方程 选择ODE求解器
  12. python现在版本强势英雄_用Python给漫威和DC英雄综合实力排位
  13. linux按行分割文件,按行切割大文件(linux split 命令简版)
  14. 十月,愿世间美好,都是恰逢其时
  15. 机房动环监控解决方案!
  16. 插入法、选择法、冒泡法(C++实现)
  17. 小米米家零冷水燃气热水器 S1 18L 评测
  18. Pipeline 基础步骤
  19. GPT-4——比GPT-3强100倍
  20. 小程序获取企业微信二维码,使用联系我插件配置企业微信二维码

热门文章

  1. DOTA 快捷键助手
  2. python获得奇数的字符串_生成每种字符都是奇数个的字符串
  3. Patran闪退 Error opening file patran File Already Exists
  4. 形容计算机老师风采的句子,形容老师讲课好的句子,赞美讲课讲得好的句子,形容讲课讲得好的句子...
  5. OutputCache 缓存 属性详解
  6. 列举几个常用的linux命令以及说明?
  7. linux脚本执行提示: No such file or directory问题解决
  8. 炫舞服务器在维护,QQ炫舞手游服务维护中
  9. 前端jquery、vue、react之性能优化
  10. my sql常用的数据类型