Android 设计支持库可扩展浮动操作按钮 (FAB) 菜单

2024-03-09

现在Android设计支持库已经出来了,有谁知道如何用它实现扩展的Fab菜单,就像Inbox App上的fab一样?

应该看起来像这样:


获得了一种更好的方法来实现动画 FAB 菜单,而无需使用任何库或为动画编写大量 xml 代码。希望这对将来需要简单方法来实现这一点的人有所帮助。

只是使用animate().translationY()函数,您可以向上或向下对任何视图进行动画处理,就像我在下面的代码中所做的那样,检查github上的完整代码 https://github.com/ajaydewari/FloatingActionButtonMenu。如果您正在 kotlin 中寻找相同的代码,您可以查看 kotlin 代码存储库动画 FAB 菜单 https://github.com/ajaydewari/Animating-FAB-Menu.

首先将所有 FAB 定义在同一位置,以便它们相互重叠,记住最上面的 FAB 应该是您想要单击并显示其他的 FAB。例如:

    <android.support.design.widget.FloatingActionButton
    android:id="@+id/fab3"
    android:layout_width="@dimen/standard_45"
    android:layout_height="@dimen/standard_45"
    android:layout_gravity="bottom|end"
    android:layout_margin="@dimen/standard_21"
    app:srcCompat="@android:drawable/ic_btn_speak_now" />

<android.support.design.widget.FloatingActionButton
    android:id="@+id/fab2"
    android:layout_width="@dimen/standard_45"
    android:layout_height="@dimen/standard_45"
    android:layout_gravity="bottom|end"
    android:layout_margin="@dimen/standard_21"
    app:srcCompat="@android:drawable/ic_menu_camera" />

<android.support.design.widget.FloatingActionButton
    android:id="@+id/fab1"
    android:layout_width="@dimen/standard_45"
    android:layout_height="@dimen/standard_45"
    android:layout_gravity="bottom|end"
    android:layout_margin="@dimen/standard_21"
    app:srcCompat="@android:drawable/ic_dialog_map" />

<android.support.design.widget.FloatingActionButton
    android: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:srcCompat="@android:drawable/ic_dialog_email" />

现在,在您的 java 类中,只需定义所有 FAB 并执行单击,如下所示:

 FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab);
    fab1 = (FloatingActionButton) findViewById(R.id.fab1);
    fab2 = (FloatingActionButton) findViewById(R.id.fab2);
    fab3 = (FloatingActionButton) findViewById(R.id.fab3);
    fab.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            if(!isFABOpen){
                showFABMenu();
            }else{
                closeFABMenu();
            }
        }
    });

Use the animation().translationY()为了使您的 FAB 动画化,我更喜欢您在 DP 中使用此方法的属性,因为仅使用 int 会影响更高分辨率或更低分辨率的显示兼容性。如下所示:

 private void showFABMenu(){
    isFABOpen=true;
    fab1.animate().translationY(-getResources().getDimension(R.dimen.standard_55));
    fab2.animate().translationY(-getResources().getDimension(R.dimen.standard_105));
    fab3.animate().translationY(-getResources().getDimension(R.dimen.standard_155));
}

private void closeFABMenu(){
    isFABOpen=false;
    fab1.animate().translationY(0);
    fab2.animate().translationY(0);
    fab3.animate().translationY(0);
}

现在在 res->values->dimens.xml 中定义上述维度,如下所示:

    <dimen name="standard_55">55dp</dimen>
<dimen name="standard_105">105dp</dimen>
<dimen name="standard_155">155dp</dimen>

希望这个解决方案能够帮助那些正在寻找简单解决方案的人们。

EDITED

如果你想在 FAB 上添加标签,那么只需采用水平 LinearLayout 并将带有 textview 的 FAB 作为标签,并为布局设置动画(如果发现这样做有任何问题),你可以在 github 中查看我的示例代码,我已经处理了所有向后兼容性该示例代码中存在问题。检查我在 Github 中的 FABMenu 示例代码 https://github.com/ajaydewari/FloatingActionButtonMenu

要在按下 Back Press 时关闭风扇,请重写 onBackPressed() ,如下所示:

    @Override
public void onBackPressed() {
    if(!isFABOpen){
        this.super.onBackPressed();
    }else{
        closeFABMenu();
    }
}

屏幕截图的标题也带有 FAB,因为我取自我的github 中存在示例应用程序 https://github.com/ajaydewari/FloatingActionButtonMenu

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Android 设计支持库可扩展浮动操作按钮 (FAB) 菜单 的相关文章

  • 将数据从服务传递到活动

    我有自行运行的服务 服务自动启动 我有活动 在此 Activity 按钮中启动该方法DoIt Button setOnClickListener new OnClickListener public void onClick View v
  • 应用程序在加载 xml 布局文件的主线程中做了太多工作

    我正在制作一个 9x9 数独网格 其中 81 个单元格本身就是一个 3x3 网格 单个细胞看起来像这样 1 2 3 4 5 6 7 8 9 每个数字代表该单元格的铅笔注释 我有一个名为 cell layout xml 的文件 表示这种 3x
  • 如何在应用程序关闭时在 Android 通知中显示操作按钮?

    我有一个安卓应用程序 对于通知 我们必须显示一些操作按钮 当应用程序打开时 我们可以自由地构建通知并显示操作按钮 但是当应用程序关闭时 通知会在 Android 的通知托盘中收到 应用程序开发人员无法控制构建用户界面和操作按钮 我们现在如何
  • 在 Android 上使用 AT 命令与调制解调器对话

    我试图与三星 Galaxy s2 plus 和华为 p1 xl u9200 调制解调器发送 AT 命令 但无法得到任何结果 我使用 adb shell 发送命令并使用 logcat 查看日志 在三星 当我执行 cat 时 proc tty
  • 在 gradle 中,我应该排除分支下的所有依赖项还是只排除根就足够了?

    我已将以下自定义任务添加到我的build gradlefile 为了打印出依赖项的依赖项 This part is useful for finding conflict resolution s between dependencies
  • 改造中的多个队列导致内存不足错误?

    我正在使用retrofit2 做我的项目 当我的呼叫失败时 我再次重复相同的呼叫 重复此 呼叫使我的应用程序强制关闭 当我查看日志时 我得到了错误日志 如下所示 我觉得这是由于同一呼叫的多次排队造成的 所以我在排队之前就这样做了 我打电话给
  • 当路径的点超出视野时,Android Canvas 不会绘制路径

    我在绘制路径时遇到了 Android Canvas 的一些问题 我的情况是 我有一个相对布局工作 如地图视图 不使用 google api 或类似的东西 我必须在该视图上绘制一条路径 canvas drawPath polyPath bor
  • Fragment 问题中的 ExpandableListView

    我正在尝试在片段中实现可扩展列表视图 没有错误出现 当我尝试记录两个的输出时List
  • 华为手机“受保护的应用程序”设置及处理方法

    我有一台搭载 Android 5 0 的华为 P8 用于测试应用程序 该应用程序需要在后台运行 因为它跟踪 BLE 区域 我发现华为内置了一个名为 受保护的应用程序 的 功能 可以从手机设置 电池管理器 gt 受保护的应用程序 访问该功能
  • 需要 Android webview window.open() 和 window.close() 的信息

    我正在开发一个安卓应用程序 这是我网站的 WebView 该网站包含一个弹出按钮 单击该按钮后 将打开一个新窗口并显示内容 该链接可以来自外部站点 然而 当我实现此操作时 新选项卡正在打开 之后它会弹出以打开浏览器 尽管在 Web 视图中打
  • ExpandableListview OnGroupClickListener 未触发

    我正在关注这个 以编程方式折叠 ExpandableListView 中的组 https stackoverflow com questions 4314777 programmatically collapse a group in ex
  • 透明 9patch 图像:显示出线条

    我得到了一个透明的 9 补丁图像 其中有 9 条补丁线显示槽 This is the output 显然我不希望水平线可见 这就是我创建 9patch 的方式 This is the final image that is used in
  • 控制 OverlayItem 大小

    我正在构建一个在单个 ItemizedOverlay 中包含几十个 OverlayItems 的地图 我的地图设计为可以非常近距离地查看 大约缩放级别 18 并且 OverlayItems 彼此非常接近 地图放大时看起来不错 但是 如果用户
  • 如何使用 SharedPreferences 保存多个值?

    我正在开发一个字典应用程序 在我的应用程序中 我假设用户想要保存最喜欢的单词 我决定使用共享首选项保存这些值 我知道 SQLite 和文件更好 但我坚持使用 SharedPreferences 所以继续使用它 下面是我的代码 Overrid
  • 如何为我的 Android Market APK 创建证书?

    我想将我的第一个 APK 应用程序上传到 Android Market 但我收到了此错误 顺便说一下 在 stackoverflow 中搜索时并没有引导我找到正确的链接 市场不接受使用调试证书签名的 APK 创建有效期至少 50 年的新证书
  • 移动设备上的 TensorFlow(Android、iOS、Windows Phone)

    我目前正在寻找不同的深度学习框架 特别是用于训练和部署卷积神经网络 要求是 它可以在带有 GPU 的普通 PC 上进行训练 但训练后的模型必须部署在三个主要的移动操作系统上 即 Android iOS 和 Windows Phone Ten
  • 使用 Play Integrity API 时,Firebase 电话身份验证会出现缺少客户端标识符错误

    使用 Firebase 电话身份验证注册 登录时 身份验证流程始终会启动 reCAPTCHA 流程 并在返回应用程序后发出missing client identifier error 我的设置之前适用于设备验证 安全网络 API 除了我的
  • Android 中的库可以有自己的意图过滤器吗?

    我想开发一个可以包含在其他 Android 应用程序中的库来拦截某些类型的意图 是否可以 我创建了一个库和一个测试项目 两者都有自己的AndroidManifest xml文件 在库的清单中 我为操作 TEST 定义了一个意图过滤器 但是
  • Android SearchView 在启动时隐藏键盘

    我有一个小问题正在尝试解决 当我打开应用程序时 键盘会显示输入搜索视图的查询 不过 我只想在单击搜索视图时显示键盘 我该如何解决 Thanks 这对我有用 用于隐藏焦点的代码 searchView SearchView view findV
  • 如何访问我的 Android 程序中的联系人

    我正在制作一个短信应用程序 并且想要访问我的 Android 应用程序中的联系人 我想访问联系人 就像他们在实际联系人列表中一样 选择后 我需要返回到我的活动 在其中我可以向该人发送短信 或者是否可以访问存储联系人的数据库 我的代码如下所示

随机推荐

  • 使用 JavaScript 将 div 定位在圆圈中

    我正在尝试定位15div元素均匀地分布在半径为150px 我正在使用以下代码 它似乎给出了一个重叠的奇怪的偏心椭圆 Fiddle http jsfiddle net 4qt5uaz1 3 Hold a global reference to
  • 如何从 jQuery 对象中删除元素?

    Code div d1 div div d2 div 我用过j add 添加元素到j 但是我该如何删除 d1 from j j remove 不起作用 因为它删除了 d1 and j length仍然是2 谢谢大家 div d1 div
  • 从IP地址获取地理位置[重复]

    这个问题在这里已经有答案了 可能的重复 在 Java 中获取地理位置的最佳方法 https stackoverflow com questions 1415851 best way to get geo location in java j
  • 避免 .NET Native 错误

    我去年 兼职 将现有 且成功的 Windows 8 1 应用程序迁移到 Windows 10 UWP 现在 就在将其发布到商店之前 我在 发布 构建模式 触发 NET Native 下测试了该应用程序 一切似乎都有效 直到我 偶然 注意到一
  • 嵌套 Python 模块导入的最佳实践

    假设我有一个 Python 模块 main py import math from the standard Python library import my own module foo math cos bar 我还需要在 my own
  • 如何使用 Linux 命令获取可用内存的百分比? [关闭]

    Closed 这个问题是无关 help closed questions 目前不接受答案 我想使用 Linux 命令行获取以百分比形式报告的可用内存 我用的是free命令 但这只是给我数字 并且没有百分比选项 使用free命令 free t
  • ssl.get_server_certificate 适用于具有 SNI(服务器名称指示)的站点

    我正在尝试获取 badssl com 子域的服务器证书 例如https expired badssl com https expired badssl com import ssl ssl get server certificate ex
  • 如何在SML中使用IntInf或LargeInt?

    我想通过此链接中的 pow 等函数在 SML 中执行大整数计算 http www standardml org Basis int inf html IntInf STR SPEC http www standardml org Basis
  • 检测图像中线条的起点和终点(numpy 数组)

    我有一个像下面这样的图像 我想要的是获取每个线段的起点和终点的坐标 实际上我的想法是考虑这样一个事实 每个极值点应该只有一个属于其邻域中的线段的点 而所有其他点应该至少有 2 个 不幸的是 该线的厚度不等于一个像素 因此这一推理不成立 这是
  • 如何使用实体关系不直接的休眠标准连接多个表?

    我有三个实体 那些是 Entity public class Organization Id private long id Column private String name Entity public class Book Id pr
  • 活跃用户 SQL 查询

    我正在尝试绘制网络应用程序中的活跃用户图表 我的数据库由两个主表组成 user and task task has a user id 我的定义活跃用户 is 在给定结束日期后两周内创建了 2 个以上任务的用户 因此 我需要一个 SQL 查
  • 在ocaml中编写多行函数

    我无法理解如何在 ocaml 中编写函数 因为我只编写了不需要用 分隔的多行的递归函数 我正在尝试创建一个函数 给定一个整数 n 返回一个充满零且对角线上只有一个的矩阵 因此大小为 n 的单位矩阵 我是函数式编程和 ocaml 的新手 所以
  • Flutter - 在 Android 上访问隐藏方法 Lsun/misc/Unsafe 错误

    我收到 Flutter 项目的错误 我将开始一一停用插件 并希望找出其中之一是否导致了问题 在那之前 我会将其留在这里 以防有人提出建议 Accessing hidden method Lsun misc Unsafe gt putObje
  • PowerShell:带有 ConvertTo-XML 输出的自定义属性 XML 标签

    我正在 PowerShell 中创建一个新对象 使用哈希表来设置属性值 然后我想使用 ConvertTo XML 方法将对象导出为 XML 格式 hash Processor Intel Disk 500GB Server ABC Seri
  • 如何使用 opencv python 将黑色更改为红色

    你怎么能用Python做到这一点 我在这条线上遇到了问题 img rgb Set mask cv2 Scalar 0 0 255 这是代码 import numpy as np import imutils import cv2 img r
  • 在 C 中将匿名结构作为参数传递

    我有以下 c 行 为了可读性而添加回车符 它们不在代码中 define i2c write slave addr reg addr len data ptr twi master write MPU TWI addr reg addr ad
  • 如何移动文件?

    我正在针对 SourceForge SVN 存储库使用 TortoiseSVN 我想将文件从一个文件夹移动到另一个文件夹以维护其修订历史记录 这可能吗 如果是这样 你会怎么做 我当前的策略是将文件复制到新文件夹中并将其签入 然后从当前文件夹
  • 优化 S3 下载大量小文件

    我目前使用转账管理器 https docs aws amazon com AWSJavaSDK latest javadoc com amazonaws services s3 transfer TransferManager html从
  • AJAX 将不带表单的 ValidateAntiForgeryToken 发布到 MVC 操作方法

    我一直在寻找如何在 SO 上执行此操作的示例 据我所知 我已经尝试了所有我能找到的示例 但到目前为止没有成功 我尝试根据我的场景更改一些实现 但到目前为止也失败了 我的页面上有这个 layout cshtml 所以我总是有一个可用的令牌
  • Android 设计支持库可扩展浮动操作按钮 (FAB) 菜单

    现在Android设计支持库已经出来了 有谁知道如何用它实现扩展的Fab菜单 就像Inbox App上的fab一样 应该看起来像这样 获得了一种更好的方法来实现动画 FAB 菜单 而无需使用任何库或为动画编写大量 xml 代码 希望这对将来