android 菜单展开动画,FloatingActionButton实现 展开/折叠 的多级悬浮菜单
虽然类似这样效果的库网上现在已经有一大堆了,甚至写的比较完美那我为什么还是要去实现呢?理由也很简单:只有自己尝试着去实现才能体会其中的奥妙 ,才能学习到新的知识这样当你在遇到自己陌生的东西就能从容的解决了。
一:万年必放效果图(没效果图鬼知道你写的是啥…)
二:使用详情
三:总体的实现思路
继承RelativeLayout 并往里面添加要展示的菜单按钮,默认不展示的时候将其设置为隐藏状态。剩下的重点就是将隐藏的菜单展示出来,这里我通过ObjectAnimator(属性动画)实现位移动画(如果还没了解过的童鞋可以网上搜一搜资料ObjectAnimator)、折叠时同样使用位移动画只需将坐标反转一下即可。
四:为了支持更高的扩展性,供使用者自定义每个菜单按钮的动画在这里添加了一个动画管理者(AnimationManager)只需要继承并实现所有的抽象方即可
public abstract class AnimationManager {
public SuspensionFab fabView;
public AnimationManager(SuspensionFab fabView) {
this.fabView = fabView;
}
/** * 给按钮添加自定义动画 * 展开动画 * *@param fab 按钮 *@param orientation 展开的方向 */
public abstract void openAnimation(FloatingActionButton fab, ExpandOrientation orientation);
/** * 给按钮添加自定义动画 * 折叠动画 * *@param fab 按钮 *@param orientation 展开的方向 */
public abstract void closeAnimation(FloatingActionButton fab, ExpandOrientation orientation);
/** * 给默认按钮添加自定义动画 * *@param fab 按钮 *@param orientation 展开的方向 *@param currentState true 为展开状态|false为折叠状态 */
public abstract void defaultFabAnimation(FloatingActionButton fab, ExpandOrientation orientation,
boolean currentState);
}
只需要在动画执行的时候调用manager中的方法,如下代码:
private void openAnimate() {
if (animationManager != null) {
animationManager.defaultFabAnimation(getFabFromTag(defaultTag), ExpandOrientation.getEnum(orientation), currentState);
}
//....
//去除第一个默认的按钮
for (int i = getChildCount() - 1; i > 0; i--) {
FloatingActionButton view = (FloatingActionButton) getChildAt(i - 1);
if (animationManager != null)
animationManager.openAnimation(view, ExpandOrientation.getEnum(orientation));//每一个view的动画,提供给使用者自定义
}
五:这里对菜单展开的方向使用了枚举来来定义 ExpandOrientation,之前对枚举也是一脸蒙蔽现在用着用着也就会了、在实际运用中也是非常的爽 ^_^。
public enum ExpandOrientation {
/** * 按钮的上边 */
FAB_TOP(1),
/** * 按钮的下边 */
FAB_BOTTOM(2),
/** * 按钮的左边 */
FAB_LEFT(3),
/** * 按钮的右边 */
FAB_RIGHT(4);
ExpandOrientation(int value) {
this.value = value;
}
private int value = 0;
/** * 根据状态值获取枚举值 * *@param value 值 *@return ExpandOrientation */
public static ExpandOrientation getEnum(int value) {
if (value == FAB_TOP.getValue()) {
return ExpandOrientation.FAB_TOP;
} else if (value == FAB_BOTTOM.getValue()) {
return ExpandOrientation.FAB_BOTTOM;
} else if (value == FAB_LEFT.getValue()) {
return ExpandOrientation.FAB_LEFT;
} else if (value == FAB_RIGHT.getValue()) {
return ExpandOrientation.FAB_RIGHT;
} else {
return ExpandOrientation.FAB_TOP;
}
}
/** *@return 枚举变量实际返回值 */
public int getValue() {
return value;
}
}
六:因为SuspensionFab view的默认大小正好是默认按钮的大小,而按钮还有阴影效果所以会导致阴影显示不全如下左图;要解决这个问题也是很简单第一种就是加大view的高宽(这也是最常用的)、第二种就是在他的父布局容器中添加android:clipChildren=”false”这个属性就是允许子view可以超出父容器的大小,这样阴影也就全部显示了如下右图:
这里需要注意的是:虽然view可以超出父容器,但是如果你需要点击事件的话就比较坑了,因为只有点击原来的容器范围内才能响应点击事件(不知道为什么,有大神知道可以告知一二)….
如果觉得不错就留下你的star吧……项目地址 ^_^
android 菜单展开动画,FloatingActionButton实现 展开/折叠 的多级悬浮菜单相关推荐
- 直播带货系统源码利用FloatingActionButton实现 展开/折叠多级悬浮菜单
直播带货系统源码利用FloatingActionButton实现 展开/折叠多级悬浮菜单的相关代码 1.大家看一下,我们最终提供出来的调用的示例: //初始化2个Item弹出菜单 val expand ...
- html5点击展开动画效果,jquery展开收缩扑克牌动画效果教程
Baraja是一个很有趣的jQuery插件.它允许你像在桌子上摊开扑克牌一样将元素展开和收缩.它使用CSS transforms来旋转和translate这些元素.它使用几个可用参数来控制各种不同的展 ...
- 【Python】Selenium多级悬浮菜单定位方法分享
举例图: 以下菜单选择需逐级鼠标悬浮显示才可选择 注明: """触发步骤:1.定位下拉框触发元素---点击----触发下拉框显示2.悬浮一级选择项,触发一级选择项3.悬浮 ...
- 推荐:炫酷菜单弹射动画:SDiffuseMenu(AwesomeMenu)
更新的文章及版本见 https://github.com/mythkiven/DiffuseMenu_Swift 本动画是 Swift 版的 AwesomeMenu,如需OC版还请移步这里. pod ...
- jQuery悬浮菜单
<!DOCTYPE html> <html><head><meta charset="utf-8"><title>< ...
- 弹出式导航html,基于JS代码实现导航条弹出式悬浮菜单
1.概述 采用弹出式悬浮菜单,不但可以使网站的导航内容更加清晰,而且不影响页面的整体效果.运行本实例,如图1所示,当鼠标移动到一级导航菜单的标题上时,将弹出悬浮菜单显示该菜单对应的子菜单,鼠标移出时, ...
- android 扇形菜单动画,Android编程:扇形展开的悬浮菜单按钮CircularFloatingActionMenu实例...
Android编程:扇形展开的悬浮菜单按钮CircularFloatingActionMenu实例 环境: 主机:WIN10 开发环境:Android Studio 2.2 Preview 3 说明: ...
- android从一点展开动画,Android自定义View——从零开始实现可展开收起的水平菜单栏...
大家要是看到有错误的地方或者有啥好的建议,欢迎留言评论 前言:最近项目里要实现一个 可展开收起的水平菜单栏控件,刚接到需求时想着用自定义View自己来绘制,发现要实现 圆角.阴影.菜单滑动等效果非常复 ...
- 直播系统源代码实现RecyclerView折叠展开动画
直播系统源代码实现RecyclerView折叠展开动画的相关代码 首先来看看布局文件 <?xml version="1.0" encoding="utf-8&quo ...
最新文章
- 前端img里面的src能是bmp么_实习|字节跳动前端实习生(非科班已定offer)三技术面+一HR面...
- 2021年中国工业互联网安全大赛核能行业赛道writeup之入门的黑客
- sql查两个时间内的数据_如何通过AWR的sql脚本查执行时间、消耗CPU、gets、I/0等的sql?...
- linux 下 C 编程和make的方法 (十、C版的try catch 捕捉段错误和异常处理)
- 编程之美-寻找最大的k个数
- springboot多数据源使用EntityManager
- 前端学习(974):视频插件zy.media.js的使用
- show部分书...
- CentOS yum安装mcrypt详细图解教程[linux]
- 从“判断力”到“创造力”:GAN 在图像生成上的应用
- C#—接口和抽象类的区别?
- 前年的斐波那契蹲在地上看着你,笑而不语
- 苹果7闪存速度测试软件,iphone6 plus闪存检测教程 iphone6检测tlc闪存图文步骤
- 论文笔记_CV_AD_A Survey of Computer Vision Research for Automotive Systems
- Linux ssh服务开启秘钥和密码认证
- asp.net开源项目及学习资料
- [翻译]xml的加密和解密
- 第七章 与Web集成——《跟我学Shiro》[张开涛]
- win10到优麒麟到深度系统
- Navicat 快捷键查询
热门文章
- 2018年美国数学建模 d题
- 使用了未经检查或不安全的操作_安全生产无隐患,瓦斯检查员安全操作技术规程...
- 开题报告、文献检索账号、文献综述、外文翻译、抄袭检测软件、论文目录,免费分享,都在这了
- 专题分纲目录 操作系统之哲学原理
- 如何正确的给CPU涂硅胶
- 酒店公共广播背景音乐系统-基于互联网+的酒店IP网络广播系统设计
- 电脑模拟写字板应用设计(Java+Swing+Eclipse)
- #520. 「LibreOJ β Round #3」绯色 IOI(开端) 贪心
- dojo发布者订阅者(dojo/topic模块)
- 深度学习中的epoch,batch_size,iterations含义解析