一、使用步骤

1.引入依赖

代码如下(示例):

implementation 'com.google.android.material:material:1.3.0'

2.xml

代码如下(示例):

android:src:显示的图标.
app:backgroundTint:正常的背景颜色
app:rippleColor:按下时的背景颜色
app:elevation:正常的阴影大小
app:pressedTranslationZ:按下时的阴影大小
app:layout_anchor:设置FAB的锚点,即以哪个控件为参照设置位置
app:layout_anchorGravity:FAB相对于锚点的位置
app:fabSize:FAB的大小,normal或mini(分别对应56dp和40dp)
app:borderWidth:边框大小,最好设置成0dp否则会有边框

android:clickable:一定要设置成true否则没有点击效果

<com.example.esp8266.activity.view.FloatBtnandroid:id="@+id/connect"android:layout_width="wrap_content"android:layout_height="wrap_content"android:clickable="true"android:focusable="true"android:layout_gravity="bottom|end"android:layout_marginBottom="25dp"android:layout_marginEnd="20dp"tools:ignore="InvalidId"android:src="@drawable/link_ico"android:scaleType="center"app:fabSize="normal"/>

3.类

public class FloatBtn extends FloatingActionButton {private static final String TAG = "MyFloatBtn";private int mLastX, mLastY;//按下时的X,Y坐标private int mDownX, mDownY;//按下时的X,Y坐标 用来计算移动的距离private int mScreenWidth, mScreenHeight;//ViewTree的宽和高// 重写了所有的构造函数,因为不知道会用哪种// 每个构造函数都进行了数据的初始化,即获取屏幕的高度和宽度public FloatBtn(Context context) {super(context);initData(context);}public FloatBtn(Context context, AttributeSet attrs) {super(context, attrs);initData(context);}public FloatBtn(Context context, AttributeSet attrs, int defStyleAttr) {super(context, attrs, defStyleAttr);initData(context);}// 初始化数据:高度和宽度。看上去没啥问题,但是运行的时候浮动按钮的一部分会跑到虚拟导航栏的下面,也就是说获取的高度超过了显示的部分,但是宽度是正常的。private void initData(Context context) {DisplayMetrics metrics = context.getResources().getDisplayMetrics();mScreenHeight = metrics.heightPixels;mScreenWidth = metrics.widthPixels;}// 重写onTouchEvent方法,主要在这个方法里面来处理点击和拖动事件@Overridepublic boolean onTouchEvent(@NonNull MotionEvent ev) {int actionId = ev.getAction();// Log.i(TAG, "onTouchEvent: " + actionId);switch (actionId) {// 无论是拖动还是点击 都需要先按下去,所以在这个case里记录按钮按下时的坐标case MotionEvent.ACTION_DOWN:// Log.i(TAG, "onTouchEvent: " + "DOWN");mLastX = (int) ev.getRawX();// getRawX: 获取的距离屏幕边缘的距离,而不是组件的mLastY = (int) ev.getRawY();mDownX = mLastX;// 判断是点击事件还是拖动事件时需要用到mDownY = mLastY;break;// 抬起事件:无论是拖动还是点击,完成之后都需要抬起按钮,在这个case里判断是拖动按钮还是点击按钮,主要是通过移动的距离来判断的,如果移动的距离超过5则认为是拖动,否则就是点击事件。如果是拖动事件则需要在此消费掉此事件,不会再执行onClick的方法。case MotionEvent.ACTION_UP:// Log.i(TAG, "onTouchEvent: " + "UP");if (calculateDistance(mDownX, mDownY, (int) ev.getRawX(), (int) ev.getRawY()) <= 5) {Log.i(TAG, "onTouchEvent: 点击事件");} else {Log.i(TAG, "onTouchEvent: 拖动事件");// 消费掉此事件return true;}break;// 移动事件:根据移动之后的位置进行重绘case MotionEvent.ACTION_MOVE:int dx = (int) ev.getRawX() - mLastX;//x方向的偏移量int dy = (int) ev.getRawY() - mLastY;//y方向的偏移量// getLeft(): Left position of this view relative to its parent.// 计算组件此时的位置,距离父容器上下左右的距离=偏移量 + 原来的距离int left = getLeft() + dx;int top = getTop() + dy;int right = getRight() + dx;int bottom = getBottom() + dy;/*if (dy < 0) {Log.i(TAG, "onTouchEvent: 向上拖动");} else {Log.i(TAG, "onTouchEvent: 向下拖动");}if (dx < 0) {Log.i(TAG, "onTouchEvent: 向左拖动");} else {Log.i(TAG, "onTouchEvent: 向右拖动");}*/mLastX = (int) ev.getRawX();mLastY = (int) ev.getRawY();if (top < 0) {// 移出了上边界top = 0;bottom = getHeight();}if (left < 0) {// 移出了左边界left = 0;right = getWidth();}if (bottom > mScreenHeight) {// 移出了下边界bottom = mScreenHeight;top = bottom - getHeight();}if (right > mScreenWidth) {// 移出了右边界right = mScreenWidth;left = right - getWidth();}layout(left, top, right, bottom);break;default:break;}return super.onTouchEvent(ev);}// get the distance between (downX, downY) and (lastX, lastY)private int calculateDistance(int downX, int downY, int lastX, int lastY) {return (int) Math.sqrt(Math.pow(1.0f * (lastX - downX), 2.0) + Math.pow((lastY - downY) * 1.0f, 2.0));}

android实现悬浮按钮功能相关推荐

  1. android 辅助功能 翻页,Android利用悬浮按钮实现翻页效果

    今天给大家分享下自己用悬浮按钮点击实现翻页效果的例子. 首先,一个按钮要实现悬浮,就要用到系统顶级窗口相关的WindowManager,WindowManager.LayoutParams.那么在An ...

  2. android悬浮按钮功能实现,Android中实现悬浮按钮

    在有些APP中我们需要实现一个悬浮按钮,比如图片浏览应用左右翻页功能,比如左侧悬浮功能按钮.我们要实现此功能时,最开始想到的就是用FrameLayout来实现,但是如果把按钮简单的放到FrameLay ...

  3. android 悬浮按钮 功能实现,怎么在Android中利用FloatingActionButton实现一个悬浮按钮效果...

    怎么在Android中利用FloatingActionButton实现一个悬浮按钮效果 发布时间:2020-12-02 17:41:30 来源:亿速云 阅读:238 作者:Leah 今天就跟大家聊聊有 ...

  4. android 悬浮按钮 功能实现,android悬浮按钮实现方法

    1,在baseactivity中写逻辑代码java //添加悬浮窗口 WindowManager mWindowManager; WindowManager.LayoutParams wmParams ...

  5. android 悬浮按钮 功能实现,Android自定义悬浮按钮效果实现,带移动效果

    一个带动画效果的悬浮按钮.从下往上显示,从上往下消失. 代码比较简单,实现原理也比较简单. public class MainActivity extends Activity { private B ...

  6. android吸附悬浮按钮,自定义可吸附的悬浮按钮

    悬浮按钮在APP中是比较常见的一个功能,因为有着比较不错的交互性,所以,在实际的开发中,或多或少都会被设计进去,今天,我们就来实现一下,可吸附的悬浮按钮是如何实现的,最终的效果图如下所示: 20181 ...

  7. android miui悬浮按钮,如何开启MIUI 8悬浮球 MIUI8悬浮球用法教程

    MIUI 8悬浮球怎么开启呢?我们知道全新的MIUI 8加入了"悬浮球"功能,可以带来更好的大屏单手操作体验.其实关于这个功能类似于IOS系统的AssistiveTouch小白点功 ...

  8. Android自定义旋钮效果,Android自定义悬浮按钮效果实现,带移动效果

    一个带动画效果的悬浮按钮.从下往上显示,从上往下消失. 代码比较简单,实现原理也比较简单. public class MainActivity extends Activity { private B ...

  9. Android展开悬浮窗功能,Android 悬浮窗 (附圆形菜单悬浮窗)

    序言 Android悬浮窗的实现,主要有四个步骤: 1. 声明及申请权限 2. 构建悬浮窗需要的控件 3. 将控件添加到WindowManager 4. 必要时更新WindowManager的布局 一 ...

最新文章

  1. Ubuntu热键控制spotify播放和音量调节
  2. 合振动的初相位推导_基于振动信号的机械设备故障诊断(一)
  3. Linux 文件夹权限
  4. python 武沛齐_武沛齐 - 主页
  5. ajax请求可以延时吗,延时校验AJAX请求
  6. python的8种标准数据类型有哪些_Python的八种数据类型
  7. 「Leetcode」142.环形链表II:环找到了,那入口呢?
  8. 【图像去噪】基于matlab中值+均值+高斯+Laplacian+Sobel+Prewitt图像去噪【含Matlab源码 025期】
  9. 算法:判断树是否相同100. Same Tree
  10. linux操作系统环境搭建实验报告,操作系统实验报告 Linux基本环境
  11. 微信小程序优惠券制作方法
  12. wps根据标题自动生成目录
  13. 基于springboot,vue旅游信息推荐系统
  14. GitHub上13个Spring Boot 优质开源项目!超53K星,一网打尽!
  15. 2022-2027年(新版)中国产权交易行业前景动态与未来发展形势报告
  16. 10个提升写作手法的方法
  17. 「TJOI 2018」碱基序列
  18. python手机触屏代码_PyGame任何触摸屏
  19. 豆粕5连跌四月季节性偏弱,铁矿石认购翻倍,甲醇05-09季节性反套2022.3.30
  20. 【JQuery】操作 DOM

热门文章

  1. 简帛企业云智库知识管理系统
  2. 创立1年拿下品类第一,创始人一句话引爆6亿阅读量,钟薛高为何如此吸睛?
  3. linux清除cache的2种方法
  4. FZU-1493-ElGamal数字签名-A^X=B(%C)求x
  5. 微信公众号前端开发,学习路线图必不可少
  6. NotePad 打开文件 出现中文汉字乱码 解决办法
  7. SRT字幕的颜色以及一些特效的设置
  8. ffmpeg基础——基本框架介绍
  9. webservice 实现与his系统对接_多平台订单管理系统:传统企业实现无缝对接多渠道资源...
  10. mtk设备模型之LCM--学习