概述

刚最近写了个浮动按钮和大家分享一下,只是在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. 构建布局良好的windows程序
  2. vscode使用教程python-使用VS Code开发Python
  3. python语句x 3 3执行_Python语言中,x=2,y=3,执行x,y=y,x之后,x和y的值分别是什么?...
  4. 关于TeamViewer中的ITbrain
  5. CloudFlare:免费CDN加速-自定义节点IP教程
  6. 哈理工OJ 1184 早起一水(水题)
  7. java asm 教程_java字节码框架ASM的深入学习
  8. kmz转换为dwg_CAD软件中的PDF插件如何实现转换DWG?一篇文章完整解释
  9. 魔兽世界私服架设 服务器架设简易教程
  10. btwdins.exe
  11. numpy 归一化 与 标准化
  12. cad延伸快捷键_熟练掌握快捷键,提高CAD绘图效率
  13. echarts 数据区域缩放
  14. MacBook 无法连接公司内网服务器
  15. 近之则不逊;慈不掌兵
  16. Pytorch:一些常用代码
  17. 数学:矩估计和最大似然估计
  18. 组织结构图模板分享,在线绘制组织结构图
  19. 微服务架构开发实战:如何集成Zuul和实现API网关?
  20. Windows PowerShell清除历史命令执行记录

热门文章

  1. VMware vCenter Server 7.0 完整安装教程
  2. 我擦!发红包遇到了微信抖动!
  3. centos7.7安装mysql8.0.18
  4. (点、6)精配准Iterative Closest Point(ICP)
  5. Mongoose基础
  6. html5请束,HTML5请柬的3种类型介绍
  7. 《机器学习实战》第3章—隐形眼镜类型(Jupyter版决策树)
  8. vue——js实现图片/文件的拖拽上传(复制粘贴就能用,还有优化空间)
  9. QRS波检测算法集锦(含源代码)
  10. 基于JSP的在线珠宝交易平台的设计与实现