概述

刚最近写了个浮动按钮和大家分享一下,只是在FloatingActionButton基础上做了点扩展,所以滑动范围仅限于父控件范围

使用效果

和正常用FloatingActionButton就可以了,加了个扩展属性scrollEnable,xml使用如下:

<com.zcx.www.scrollfloatingbuttonlib.ScrollFloatinigButtonandroid:id="@+id/fab"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_gravity="bottom|end"android:layout_margin="@dimen/fab_margin"app:scrollEnable="true"app:srcCompat="@android:drawable/ic_dialog_email" />

java代码都是自动生成的,还是贴一下吧

FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab);fab.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View view) {Snackbar.make(view, "Replace with your own action", Snackbar.LENGTH_LONG).setAction("Action", null).show();}});

先看看效果

代码实现

主要是处理一下滑动就好了

/*** author:  zhouchaoxiang* date:    2019/4/25* explain:可滑动的floatActionButton*/
public class ScrollFloatinigButton extends FloatingActionButton {private static final String TAG = "ScrollFloatinigButton";private float mX;private float mY;private int mParentWidth;private int mParentHeight;private boolean mScrollEnable = true;private int mScrollLeft;private int mScrollTop;private int mRight;private int mScrollRight;private int mScrollBottom;private boolean hasScroll;boolean isScroll = false;public ScrollFloatinigButton(Context context) {this(context, null);}public ScrollFloatinigButton(Context context, AttributeSet attrs) {this(context, attrs, 0);}public ScrollFloatinigButton(Context context, AttributeSet attrs, final int defStyleAttr) {super(context, attrs, defStyleAttr);TypedArray ta = context.obtainStyledAttributes(attrs, R.styleable.ScrollFloatinigButton);mScrollEnable = ta.getBoolean(R.styleable.ScrollFloatinigButton_scrollEnable, true);ta.recycle();}@Overrideprotected void onAttachedToWindow() {super.onAttachedToWindow();//防止布局重置时重置ScrollFloatinigButton的位置ViewParent parent = getParent();if (parent instanceof ViewGroup) {((ViewGroup) getParent()).addOnLayoutChangeListener(new OnLayoutChangeListener() {@Overridepublic void onLayoutChange(View v, int left, int top, int right, int bottom, int oldLeft, int oldTop, int oldRight, int oldBottom) {if (hasScroll && mScrollRight != 0 && mScrollBottom != 0)layout(mScrollLeft, mScrollTop, mScrollRight, mScrollBottom);}});}}@Overrideprotected void onSizeChanged(int w, int h, int oldw, int oldh) {super.onSizeChanged(w, h, oldw, oldh);if (getParent() instanceof ViewGroup) {mParentWidth = ((ViewGroup) getParent()).getWidth();mParentHeight = ((ViewGroup) getParent()).getHeight();}Log.i(TAG, "onSizeChanged: ");}@Overridepublic boolean onTouchEvent(MotionEvent ev) {if (!mScrollEnable) return super.onTouchEvent(ev);switch (ev.getAction()) {case MotionEvent.ACTION_DOWN:mX = ev.getX();mY = ev.getY();super.onTouchEvent(ev);return true;case MotionEvent.ACTION_MOVE:int scaledTouchSlop = ViewConfiguration.get(getContext()).getScaledTouchSlop();float x = ev.getX();float y = ev.getY();x = x - mX;y = y - mY;if (Math.abs(scaledTouchSlop) < Math.abs(x) || Math.abs(scaledTouchSlop) < Math.abs(y)) {isScroll = true;}if (isScroll) {mScrollLeft = (int) (getX() + x);mScrollTop = (int) (getY() + y);mScrollRight = (int) (getX() + getWidth() + x);mScrollBottom = (int) (getY() + getHeight() + y);//防止滑出父界面if (mScrollLeft < 0 || mScrollRight > mParentWidth) {mScrollLeft = (int) getX();mScrollRight = (int) getX() + getWidth();}if (mScrollTop < 0 || mScrollBottom > mParentHeight) {mScrollTop = (int) getY();mScrollBottom = (int) getY() + getHeight();}layout(mScrollLeft, mScrollTop, mScrollRight, mScrollBottom);hasScroll = true;return true;}break;case MotionEvent.ACTION_UP:case MotionEvent.ACTION_CANCEL:if (isScroll) {isScroll = false;setPressed(false);//重置点击状态return true;}break;}return super.onTouchEvent(ev);}public void setScrollEnable(boolean scrollEnable) {mScrollEnable = scrollEnable;}public boolean isScrollEnable() {return mScrollEnable;}
}

在values目录下创建attrs.xml文件,添加如下属性

<resources><declare-styleable name="ScrollFloatinigButton"><attr name="scrollEnable" format="boolean" /></declare-styleable>
</resources>

大功告成.

总结

这里就总结一下滑动了几种方式吧.

  1. scrollTo和scrollBy
    可滑动view里面的内容,scrollTo为绝对坐标,scrollBy为相对于view的当前坐标
  2. LayoutParams
    可滑动view本身,范围限view的父控件范围,这种方式通过设置LayoutParams的margin值达到移动view的效果,可滑动view本身.
  3. view.layout()和offsetLeftAndRight或offsetTopAndBottom
    可滑动view本身,范围限view的父控件范围,重新设置view的四个顶点坐标来达到滑动view的效果
  4. 属性动画
    可滑动view到任意位置,具体如下
    view.setTranslationX();
    view.setTranslationY();

可滑动的浮动按钮(FloatingActionButton)相关推荐

  1. 浮动按钮FloatingActionButton

    FloatingActionButton是继承至ImageView,所以FloatingActionButton拥有ImageView的所有属性.CoordinatorLayout可以用来配合Floa ...

  2. Flutter中的浮动按钮 FloatingActionButton

    FloatingActionButton 简称 FAB ,可以实现浮动按钮,也可以实现类似闲鱼 app 的底部凸起导航 . 常用属性 FloatingActionButton的常用属性,同flutte ...

  3. 【Flutter】Flutter 拍照示例 ( 浮动按钮及点击事件 | 底部显示按钮组件 | 手势检测器组件 | 拍照并获取当前拍摄照片 | 从相册中选择图片 )

    文章目录 一.浮动按钮及点击事件 二.底部显示按钮组件 三.手势检测器组件 四.image_picker 完整代码示例 五.相关资源 一.浮动按钮及点击事件 一般使用 Scaffold 组件作为界面的 ...

  4. 9_flutter_SimpleDialog(对话框),FloatingActionButton(浮动按钮),Slider(滑动器)

    1_SimpleDialog(对话框) import 'package:flutter/material.dart'; import 'dart:async';void main(){runApp(M ...

  5. android—ListView与RecyclerView滑动显示和隐藏浮动按钮

    效果 自定义悬浮按钮 package cn.tsou.floatingactionbuttondemo.view;import android.content.Context; import andr ...

  6. Android开发动态圆形浮动菜单按钮,Android编程:悬浮菜单按钮FloatingActionButton实例...

    Android编程:悬浮菜单按钮FloatingActionButton实例 环境: 主机:WIN10 开发环境:Android Studio 2.2 Preview 3 说明: 用第三方库Float ...

  7. android shape 按钮背景_flutter好用的轮子推荐十三-flutter可展开选项的浮动按钮

    前言 Flutter是谷歌的移动UI框架,可以快速在iOS和Android上构建高质量的原生用户界面. IT界著名的尼古拉斯·高尔包曾说:轮子是IT进步的阶梯!热门的框架千篇一律,好用轮子万里挑一!F ...

  8. Flutter 悬浮按钮 FloatingActionButton 的详细配置使用

    志在巅峰的攀登者,不会陶醉在沿途的某个脚印之中,在码农的世界里,优美的应用体验,来源于程序员对细节的处理以及自我要求的境界,年轻人也是忙忙碌碌的码农中一员,每天.每周,都会留下一些脚印,就是这些创作的 ...

  9. html 两个idv上下居中,Django搭建个人博客:回到顶部浮动按钮、矢量图标、页脚沉底和粘性侧边栏...

    本章集中介绍四个重要的小功能:回到顶部浮动按钮.矢量图标.页脚沉底和粘性侧边栏. 这几个功能与Django基本没啥关系,更多的是前端知识,但是对博客网站都很重要,问的读者也比较多,因此也集中讲一下好了 ...

最新文章

  1. linux中断下半部
  2. K8s 从懵圈到熟练-集群伸缩原理
  3. WinAPI: waveOutGetNumDevs - 获取波形输出设备的数目
  4. 比Java语言更好,为什么Java比其他解释语言具有更好的性能?
  5. LOL服务器维护打排位算吗,LOL:请停止你的排位行为,这是连败前的征兆!再玩就会一直掉分...
  6. 【纪念】我的大学同学名单
  7. SqlBulkCopy做大数据插入
  8. 漏桶算法和令牌桶算法
  9. Atitit 小程序后端服务api艾提拉总结 目录 1. 服务端 1 1.1. 开放接口 1 1.1.1. 登录 1 1.1.2. 用户信息 1 1.1.3. 接口调用凭证 2 1.1.4. 数据分
  10. cmosfixr插件怎么用_Excel处理临床数据:插件篇
  11. 计算机核心期刊排名及投稿信息
  12. 在拼多多上抢了点茅台
  13. Mac 安装natapp
  14. 计算机配置太低,安装Win10系统电脑配置太低怎么办
  15. 2.licheepi亲自编译内核
  16. Android练习之ImageAdapter
  17. html把毫秒转换成年月日,如何使用JavaScript将毫秒转换为日期格式?
  18. “真正的”Apk增量更新方案ApkDiffPatch
  19. ASP.NET动态网站开发培训-04.创建一个四则运算器
  20. Selenium 原理

热门文章

  1. Heartbleed第一篇:“心脏流血”高危漏洞情况通报(4月9日结果)
  2. web网页设计实例作业 ——中国水墨风书画艺术网站(12页)HTML DⅣV+ CSSJS
  3. Raven 2 靶机渗透
  4. sql 按照天环比_sql server 获取同比或环比
  5. TCP长连接下,在应用层面,定制自己的负载均衡
  6. python3 爬虫实例_Python3爬虫三大案例实战分享-天善学院
  7. DS18B20温度转化
  8. Occupancy Network综述!Grid-Centric的感知方法(BEV/多任务/轨迹预测等)
  9. Csrf再识及初识Json劫持
  10. SolidWorks 钣金 焊接 管道 布线视频教程