如何使用真正的浮动操作按钮(FAB)扩展?

Can*_*ato 7 java android floating-action-button

消除对重复的任何疑虑或想法:在Material Design上定义什么是"扩展".

FAB  - 扩展FAB

但大多数人都将"扩展"与" 转型类型:快速拨号 " 混为一谈,难以找到解决方案.喜欢这里

FAB  - 过渡类型:快速拨号

问题 所以我期待的是如何使用文本和扩展大小设置FAB.

今天我的代码是这样的:

<android.support.design.widget.FloatingActionButton
    android:id="@+id/maps_main_distance_btn"
    android:layout_width="0dp"
    android:layout_height="wrap_content"
    android:layout_marginBottom="8dp"
    android:text="@string/str_distance_btn"
    app:elevation="0dp"
    app:layout_constraintBottom_toBottomOf="parent"
    app:layout_constraintEnd_toEndOf="parent"
    app:layout_constraintStart_toStartOf="parent" />
Run Code Online (Sandbox Code Playgroud)

但我的按钮看起来像这样:

在此输入图像描述

没有文字,没有正确的格式.我在Constraint Layout中使用它.

小智 10

  1. 在Gradle文件中添加依赖项:
implementation 'com.google.android.material:material:1.1.0-alpha04'
Run Code Online (Sandbox Code Playgroud)

在您的xml文件中:

<com.google.android.material.floatingactionbutton.ExtendedFloatingActionButton
            android:id="@+id/fab"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_gravity="bottom|end"
            android:layout_alignParentBottom="true"
            android:layout_alignParentEnd="true"
            android:layout_margin="@dimen/fab_margin"
            android:text="Create"
            app:icon="@drawable/outline_home_24" />
Run Code Online (Sandbox Code Playgroud)

  • 不要忘记放置材料组件主题,例如'Theme.MaterialComponents.NoActionBar' (9认同)
  • 如果您的活动主题未继承 'Theme.MaterialComponents.NoActionBar' ,则必须包含 android:theme="@style/Theme.MaterialComponents.NoActionBar" 作为按钮的属性。否则有机会出现布局膨胀异常 (7认同)
  • 给这个人一块奖章! (3认同)

Tun*_*i_D 7

在此输入图像描述

您可以创建一个实用程序类,使用a 将动画a MaterialButton设置为扩展.您首先需要声明xml中的两个状态,然后使用它们在它们之间进行动画处理.FloatingActionButtonConstraintLayoutMaterialButtonTransitionManager

你可以在这里阅读一篇关于它的中篇文章,与此同时,我会在这里添加一些相关的代码.

折叠的FAB状态:

<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout android:id="@+id/extend_fab_container"
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:background="@drawable/bg_fab"
    android:elevation="8dp">

    <android.support.design.button.MaterialButton
        android:id="@+id/fab"
        style="@style/Widget.MaterialComponents.Button.UnelevatedButton"
        android:layout_width="56dp"
        android:layout_height="56dp"
        app:cornerRadius="56dp"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toRightOf="parent"
        app:layout_constraintTop_toTopOf="parent" />
</android.support.constraint.ConstraintLayout>
Run Code Online (Sandbox Code Playgroud)

扩展的FAB状态:

<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout android:id="@+id/extend_fab_container"
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:elevation="8dp"
    android:background="@drawable/bg_fab">

    <android.support.design.button.MaterialButton
        android:id="@+id/fab"
        style="@style/Widget.MaterialComponents.Button.UnelevatedButton"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        app:cornerRadius="56dp"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toRightOf="parent"
        app:layout_constraintTop_toTopOf="parent" />
</android.support.constraint.ConstraintLayout>
Run Code Online (Sandbox Code Playgroud)

背景图纸:

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
    <solid android:color="@color/colorAccent" />
    <corners android:radius="56dp" />
</shape>
Run Code Online (Sandbox Code Playgroud)

和相关的Java扩展代码:

private void setExtended(boolean extended, boolean force) {
    if (isAnimating || (extended && isExtended() && !force)) return;

    ConstraintSet set = new ConstraintSet();
    set.clone(container.getContext(), extended ? R.layout.fab_extended : R.layout.fab_collapsed);

    TransitionManager.beginDelayedTransition(container, new AutoTransition()
            .addListener(listener).setDuration(150));

    if (extended) button.setText(currentText);
    else button.setText("");

    set.applyTo(container);
}
Run Code Online (Sandbox Code Playgroud)