Android自定义可移动悬浮按钮
<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自定义可移动悬浮按钮相关推荐
- Android自定义可移动悬浮按钮,附大厂真题面经
android:layout_width="wrap_content" app:borderWidth="0dp" app:backgroundTint=&qu ...
- 直播商城开发Android自定义可移动悬浮按钮
在布局文件添加控件时可使用如下方式: <android.support.design.widget.FloatingActionButton......./> 也可使用自定义的包名: co ...
- android布局黑色字体颜色,Android开发之FloatingActionButton悬浮按钮基本使用、字体、颜色用法示例...
本文实例讲述了Android开发之FloatingActionButton悬浮按钮基本使用.字体.颜色用法.分享给大家供大家参考,具体如下: 这里主要讲: FloatingActionsMenu自定义 ...
- Android自定义View-滑动解锁按钮
Android自定义View-滑动解锁按钮 写在前面 一.实现的思路 二.先上成品图 三.自定义属性 四.使用 五.具体实现 写在前面 最近由于项目需求,需要有一个类似苹果的滑动解锁控件,抱着万事不求 ...
- android设置自定义按钮,Android自定义View之元素按钮
Android自定义View之元素按钮 之前在dribbble看到的三个元素的按钮,参考了设计的创意,添加了自己定义的动画效果来实现.先看效果 效果图 分别是水火电三个元素的按钮实现.其中电的实现最简 ...
- android悬浮功能实现,Android实现系统级悬浮按钮
本文实例为大家分享了Android系统级悬浮按钮的具体代码,供大家参考,具体内容如下 具体的需求 1.就是做一个系统级的悬浮按钮,就像iPhone 桌面的那个悬浮按钮效果一样,能随意拖动,并且手一放开 ...
- Android 可拖拽悬浮按钮
转自http://www.jianshu.com/p/ba3e5fc5cff1 实现思路 通过重写控件的onTouchEvent方法监听触摸效果. 通过View的setX()和setY()方法实现移动 ...
- Android自定义弹窗——右上角悬浮关闭
今天打开QQ音乐时,看到更新界面右上角悬浮关闭按钮,本来想应该挺简单的,于是就想顺手写一个,但是不试不知道,一试就出问题咯. 于是在原有自己封装的dialog中进行修改,原有样式 本来以为只要加个ma ...
- android自定义adapter(实现对按钮的监听)
我们一般需要自定义adapter 这里就需要继承BaseAdapter adapter在MVC开发模式中,是控制层 baseAdapter 继承这个方法必须重写 四个方法 1. getcont ...
最新文章
- 基于深度学习的肺癌预测诊断
- win7安装omnetpp-4.6
- UNIX高级环境编程(9)进程控制(Process Control)- fork,vfork,僵尸进程,wait和waitpid...
- 鸿蒙自研系统,华为已注册“华为鸿蒙”商标,自研操作系统最快秋季发布
- Android开发——RecyclerView特性以及基本使用方法(二)
- python除法函数一般如何命名_关于python:当用于除法时,’/’和’//’之间有什么区别?...
- 前端学习(2694):重读vue电商网站15之阻止页签tabs切换
- 《人人都是产品经理》读后感
- vue delete删除json数组_Vue.set 和 Vue.delete
- 用VS.NET 2005制作安装程序
- MATLAB 数学应用 微分方程 常微分方程 选择ODE求解器
- python现在版本强势英雄_用Python给漫威和DC英雄综合实力排位
- linux按行分割文件,按行切割大文件(linux split 命令简版)
- 十月,愿世间美好,都是恰逢其时
- 机房动环监控解决方案!
- 插入法、选择法、冒泡法(C++实现)
- 小米米家零冷水燃气热水器 S1 18L 评测
- Pipeline 基础步骤
- GPT-4——比GPT-3强100倍
- 小程序获取企业微信二维码,使用联系我插件配置企业微信二维码
热门文章
- DOTA 快捷键助手
- python获得奇数的字符串_生成每种字符都是奇数个的字符串
- Patran闪退 Error opening file patran File Already Exists
- 形容计算机老师风采的句子,形容老师讲课好的句子,赞美讲课讲得好的句子,形容讲课讲得好的句子...
- OutputCache 缓存 属性详解
- 列举几个常用的linux命令以及说明?
- linux脚本执行提示: No such file or directory问题解决
- 炫舞服务器在维护,QQ炫舞手游服务维护中
- 前端jquery、vue、react之性能优化
- my sql常用的数据类型