Android自定义可移动悬浮按钮,附大厂真题面经
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自定义可移动悬浮按钮,附大厂真题面经相关推荐
- Android自定义可移动悬浮按钮
<com.example.notepad2.DragFloatActionButton android:id="@+id/fb" android:layout_height= ...
- 直播商城开发Android自定义可移动悬浮按钮
在布局文件添加控件时可使用如下方式: <android.support.design.widget.FloatingActionButton......./> 也可使用自定义的包名: co ...
- android开发资料!4年小Android的心路历程,附大厂真题面经
前言 经常在群里听到大家对Android抱有一些消极的态度,说Android凉了,想要换个方向,但是如果换个方向就能变成大牛的话,那大家都换就好了. 其实任何方向都存在"二八"定律 ...
- 2021年GitHub上那些优秀Android开源库总结,附大厂真题面经
前言 就要到"金九银十"面试跳槽季了,需要找工作的小伙伴们该要着手开始复习了.特此将我今年收录的一些腾讯.阿里巴巴.字节跳动等等一线互联网巨头的面试真题体系的归类.整理了一下,拿来 ...
- android计步器!五步搞定Android开发环境部署,附大厂真题面经
缘起 经过近十年的发展,Android技术优化日新月异,如今Android 10.0 已经发布,Android系统性能也已经非常流畅,可以在体验上完全媲美iOS.到了各大厂商手里,改源码.自定义系统, ...
- 超详细讲解!在字节跳动我是如何当面试官的,附大厂真题面经
前言 Android技术迭代更新很快,各种新出的技术和名词也是层出不穷.不知从什么时候开始,总是会时不时听到AndroidX这个名词,这难道又是什么新出技术吗?相信有很多朋友也会存在这样的疑惑,那么今 ...
- 腾讯Android开发面试记录,附大厂真题面经
前言 回顾一下自己这段时间的经历,因公司突然通知裁员,我匆匆忙忙地出去面了几家,但最终都没有拿到offer,我感觉今年的寒冬有点冷.公司开始第二波裁员,我决定主动拿赔偿走人.后续的面试过程我做了一些准 ...
- android布局黑色字体颜色,Android开发之FloatingActionButton悬浮按钮基本使用、字体、颜色用法示例...
本文实例讲述了Android开发之FloatingActionButton悬浮按钮基本使用.字体.颜色用法.分享给大家供大家参考,具体如下: 这里主要讲: FloatingActionsMenu自定义 ...
- Android自定义View-滑动解锁按钮
Android自定义View-滑动解锁按钮 写在前面 一.实现的思路 二.先上成品图 三.自定义属性 四.使用 五.具体实现 写在前面 最近由于项目需求,需要有一个类似苹果的滑动解锁控件,抱着万事不求 ...
最新文章
- 树形动态规划 - 树中距离之和
- less学习三---父选择器
- mysql 异步_MySQL -- 异步I/O
- php按照二维数组某个字段排序,PHP 二维数组根据某个字段排序
- python 遍历文件夹下文件修改并保存_利用python完成自动化的任务之遍历文件夹修改文件之后并保存备份...
- jsp跨域访问cookies_cookie 跨域访问的解决方案
- samsung-smart app 开发
- python调用cplex_python 调用cplex(设置 CPLEX 的 Python API)
- 地区的省市区联动数据样例
- torch.optim 中的优化器
- 黑帽SEO研究之js快照劫持代码分析
- PTA 7-5 jmu-java-m05-自定义Judgeable接口 (10 分) JAVA
- 「CodePlus 2017 11 月赛」大吉大利,晚上吃鸡!(dij+bitset)
- Generalized Robust Regression for Jointly Sparse Subspace Learning
- 自适应滤波器原理——新息过程
- GPS主时钟|北斗卫星时钟|GPS卫星同步时钟|北斗时钟系统
- 在 关闭页面/卸载(unload)文档 之前向服务器发送请求
- 心脏流血(Heartbleed )漏洞详解
- 【SW7203】智融新料号SW7203,支持1-4S,双向升降压,路径管理,可搭配SW2303,实现车充、移动电源100W
- 【OpenCV 例程 300篇】231. 特征描述之灰度共生矩阵(GLCM)