可滑动的浮动按钮(FloatingActionButton)
概述
刚最近写了个浮动按钮和大家分享一下,只是在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>
大功告成.
总结
这里就总结一下滑动了几种方式吧.
- scrollTo和scrollBy
可滑动view里面的内容,scrollTo为绝对坐标,scrollBy为相对于view的当前坐标 - LayoutParams
可滑动view本身,范围限view的父控件范围,这种方式通过设置LayoutParams的margin值达到移动view的效果,可滑动view本身. - view.layout()和offsetLeftAndRight或offsetTopAndBottom
可滑动view本身,范围限view的父控件范围,重新设置view的四个顶点坐标来达到滑动view的效果 - 属性动画
可滑动view到任意位置,具体如下
view.setTranslationX();
view.setTranslationY();
可滑动的浮动按钮(FloatingActionButton)相关推荐
- 浮动按钮FloatingActionButton
FloatingActionButton是继承至ImageView,所以FloatingActionButton拥有ImageView的所有属性.CoordinatorLayout可以用来配合Floa ...
- Flutter中的浮动按钮 FloatingActionButton
FloatingActionButton 简称 FAB ,可以实现浮动按钮,也可以实现类似闲鱼 app 的底部凸起导航 . 常用属性 FloatingActionButton的常用属性,同flutte ...
- 【Flutter】Flutter 拍照示例 ( 浮动按钮及点击事件 | 底部显示按钮组件 | 手势检测器组件 | 拍照并获取当前拍摄照片 | 从相册中选择图片 )
文章目录 一.浮动按钮及点击事件 二.底部显示按钮组件 三.手势检测器组件 四.image_picker 完整代码示例 五.相关资源 一.浮动按钮及点击事件 一般使用 Scaffold 组件作为界面的 ...
- 9_flutter_SimpleDialog(对话框),FloatingActionButton(浮动按钮),Slider(滑动器)
1_SimpleDialog(对话框) import 'package:flutter/material.dart'; import 'dart:async';void main(){runApp(M ...
- android—ListView与RecyclerView滑动显示和隐藏浮动按钮
效果 自定义悬浮按钮 package cn.tsou.floatingactionbuttondemo.view;import android.content.Context; import andr ...
- Android开发动态圆形浮动菜单按钮,Android编程:悬浮菜单按钮FloatingActionButton实例...
Android编程:悬浮菜单按钮FloatingActionButton实例 环境: 主机:WIN10 开发环境:Android Studio 2.2 Preview 3 说明: 用第三方库Float ...
- android shape 按钮背景_flutter好用的轮子推荐十三-flutter可展开选项的浮动按钮
前言 Flutter是谷歌的移动UI框架,可以快速在iOS和Android上构建高质量的原生用户界面. IT界著名的尼古拉斯·高尔包曾说:轮子是IT进步的阶梯!热门的框架千篇一律,好用轮子万里挑一!F ...
- Flutter 悬浮按钮 FloatingActionButton 的详细配置使用
志在巅峰的攀登者,不会陶醉在沿途的某个脚印之中,在码农的世界里,优美的应用体验,来源于程序员对细节的处理以及自我要求的境界,年轻人也是忙忙碌碌的码农中一员,每天.每周,都会留下一些脚印,就是这些创作的 ...
- html 两个idv上下居中,Django搭建个人博客:回到顶部浮动按钮、矢量图标、页脚沉底和粘性侧边栏...
本章集中介绍四个重要的小功能:回到顶部浮动按钮.矢量图标.页脚沉底和粘性侧边栏. 这几个功能与Django基本没啥关系,更多的是前端知识,但是对博客网站都很重要,问的读者也比较多,因此也集中讲一下好了 ...
最新文章
- 构建布局良好的windows程序
- vscode使用教程python-使用VS Code开发Python
- python语句x 3 3执行_Python语言中,x=2,y=3,执行x,y=y,x之后,x和y的值分别是什么?...
- 关于TeamViewer中的ITbrain
- CloudFlare:免费CDN加速-自定义节点IP教程
- 哈理工OJ 1184 早起一水(水题)
- java asm 教程_java字节码框架ASM的深入学习
- kmz转换为dwg_CAD软件中的PDF插件如何实现转换DWG?一篇文章完整解释
- 魔兽世界私服架设 服务器架设简易教程
- btwdins.exe
- numpy 归一化 与 标准化
- cad延伸快捷键_熟练掌握快捷键,提高CAD绘图效率
- echarts 数据区域缩放
- MacBook 无法连接公司内网服务器
- 近之则不逊;慈不掌兵
- Pytorch:一些常用代码
- 数学:矩估计和最大似然估计
- 组织结构图模板分享,在线绘制组织结构图
- 微服务架构开发实战:如何集成Zuul和实现API网关?
- Windows PowerShell清除历史命令执行记录