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) {

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 bool
ean 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);

return ev.getAction() != MotionEvent.ACTION_UP && (mIsDrag || super.onTouchEvent(ev));

}

private boolean isNotDrag(){

return !isDrag&&(getX()==0

t();

}

}

break;

}

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

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

return ev.getAction() != MotionEvent.ACTION_UP && (mIsDrag || super.onTouchEvent(ev));

}

private boolean isNotDrag(){

return !isDrag&&(getX()==0

Android自定义可移动悬浮按钮,附大厂真题面经相关推荐

  1. Android自定义可移动悬浮按钮

    <com.example.notepad2.DragFloatActionButton android:id="@+id/fb" android:layout_height= ...

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

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

  3. android开发资料!4年小Android的心路历程,附大厂真题面经

    前言 经常在群里听到大家对Android抱有一些消极的态度,说Android凉了,想要换个方向,但是如果换个方向就能变成大牛的话,那大家都换就好了. 其实任何方向都存在"二八"定律 ...

  4. 2021年GitHub上那些优秀Android开源库总结,附大厂真题面经

    前言 就要到"金九银十"面试跳槽季了,需要找工作的小伙伴们该要着手开始复习了.特此将我今年收录的一些腾讯.阿里巴巴.字节跳动等等一线互联网巨头的面试真题体系的归类.整理了一下,拿来 ...

  5. android计步器!五步搞定Android开发环境部署,附大厂真题面经

    缘起 经过近十年的发展,Android技术优化日新月异,如今Android 10.0 已经发布,Android系统性能也已经非常流畅,可以在体验上完全媲美iOS.到了各大厂商手里,改源码.自定义系统, ...

  6. 超详细讲解!在字节跳动我是如何当面试官的,附大厂真题面经

    前言 Android技术迭代更新很快,各种新出的技术和名词也是层出不穷.不知从什么时候开始,总是会时不时听到AndroidX这个名词,这难道又是什么新出技术吗?相信有很多朋友也会存在这样的疑惑,那么今 ...

  7. 腾讯Android开发面试记录,附大厂真题面经

    前言 回顾一下自己这段时间的经历,因公司突然通知裁员,我匆匆忙忙地出去面了几家,但最终都没有拿到offer,我感觉今年的寒冬有点冷.公司开始第二波裁员,我决定主动拿赔偿走人.后续的面试过程我做了一些准 ...

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

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

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

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

最新文章

  1. 树形动态规划 - 树中距离之和
  2. less学习三---父选择器
  3. mysql 异步_MySQL -- 异步I/O
  4. php按照二维数组某个字段排序,PHP 二维数组根据某个字段排序
  5. python 遍历文件夹下文件修改并保存_利用python完成自动化的任务之遍历文件夹修改文件之后并保存备份...
  6. jsp跨域访问cookies_cookie 跨域访问的解决方案
  7. samsung-smart app 开发
  8. python调用cplex_python 调用cplex(设置 CPLEX 的 Python API)
  9. 地区的省市区联动数据样例
  10. torch.optim 中的优化器
  11. 黑帽SEO研究之js快照劫持代码分析
  12. PTA 7-5 jmu-java-m05-自定义Judgeable接口 (10 分) JAVA
  13. 「CodePlus 2017 11 月赛」大吉大利,晚上吃鸡!(dij+bitset)
  14. Generalized Robust Regression for Jointly Sparse Subspace Learning
  15. 自适应滤波器原理——新息过程
  16. GPS主时钟|北斗卫星时钟|GPS卫星同步时钟|北斗时钟系统
  17. 在 关闭页面/卸载(unload)文档 之前向服务器发送请求
  18. 心脏流血(Heartbleed )漏洞详解
  19. 【SW7203】智融新料号SW7203,支持1-4S,双向升降压,路径管理,可搭配SW2303,实现车充、移动电源100W
  20. 【OpenCV 例程 300篇】231. 特征描述之灰度共生矩阵(GLCM)

热门文章

  1. windows脚本实战
  2. oracle 查看表和列描述
  3. graylog-server配置文件详解
  4. 茶馆小人书 (AFO)
  5. JavaWeb项目 JSP+SQL个人博客系统多人
  6. MySQL | 触发器
  7. 洪泛路由模拟(Java实现)
  8. infopath2013,重复表序号自动递增
  9. 删除历史记录后,兼容性视图列表被清空怎么办?
  10. Oracle OMF(Oracle Managed Files ) 说明