可滑动的浮动按钮(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基本没啥关系,更多的是前端知识,但是对博客网站都很重要,问的读者也比较多,因此也集中讲一下好了 ...
最新文章
- linux中断下半部
- K8s 从懵圈到熟练-集群伸缩原理
- WinAPI: waveOutGetNumDevs - 获取波形输出设备的数目
- 比Java语言更好,为什么Java比其他解释语言具有更好的性能?
- LOL服务器维护打排位算吗,LOL:请停止你的排位行为,这是连败前的征兆!再玩就会一直掉分...
- 【纪念】我的大学同学名单
- SqlBulkCopy做大数据插入
- 漏桶算法和令牌桶算法
- Atitit 小程序后端服务api艾提拉总结 目录 1. 服务端	1 1.1. 开放接口	1 1.1.1. 登录	1 1.1.2. 用户信息	1 1.1.3. 接口调用凭证	2 1.1.4. 数据分
- cmosfixr插件怎么用_Excel处理临床数据:插件篇
- 计算机核心期刊排名及投稿信息
- 在拼多多上抢了点茅台
- Mac 安装natapp
- 计算机配置太低,安装Win10系统电脑配置太低怎么办
- 2.licheepi亲自编译内核
- Android练习之ImageAdapter
- html把毫秒转换成年月日,如何使用JavaScript将毫秒转换为日期格式?
- “真正的”Apk增量更新方案ApkDiffPatch
- ASP.NET动态网站开发培训-04.创建一个四则运算器
- Selenium 原理
热门文章
- Heartbleed第一篇:“心脏流血”高危漏洞情况通报(4月9日结果)
- web网页设计实例作业 ——中国水墨风书画艺术网站(12页)HTML DⅣV+ CSSJS
- Raven 2 靶机渗透
- sql 按照天环比_sql server 获取同比或环比
- TCP长连接下,在应用层面,定制自己的负载均衡
- python3 爬虫实例_Python3爬虫三大案例实战分享-天善学院
- DS18B20温度转化
- Occupancy Network综述!Grid-Centric的感知方法(BEV/多任务/轨迹预测等)
- Csrf再识及初识Json劫持
- SolidWorks 钣金 焊接 管道 布线视频教程