Как изменить форму кнопки плавающего действия (FAB) на Android?

В нашем приложении для Android нам нужно создать плавающую кнопку действия, которая не является кругом по умолчанию, а квадратом с тремя закругленными углами. Строка выглядит на изображении ниже:

enter image description here

Мне удалось создать такую форму, но я не знаю, как ее применить к моей фабрике, или если это возможно. Файл xml для формы выглядит так:

   <shape xmlns:android="http://schemas.android.com/apk/res/android"
      android:shape="rectangle">
    <solid android:color="@color/red" />
    <corners
      android:topLeftRadius="90dp"
      android:topRightRadius="90dp"
      android:bottomRightRadius="90dp"/>
   </shape>

Я попытался изменить форму с помощью

android:src="@drawable/my_shape"

но это меняет только значок внутри моей кнопки. Я думаю, мне нужно расширить FloatingActionButton, но я понятия не имею, как это сделать.

Есть ли способ изменить форму фабрики? Если кто-то уже достиг этого, я был бы признателен за образец.

Ответ 1

FloatingActionButton, предоставляемый библиотеками поддержки, не может быть расширен, поскольку методы, которые необходимо будет заменить, устанавливаются как закрытые. Material Components (официальная замена AndroidX для библиотеки поддержки) имеет форму Shape Theming по дорожной карте в течение октября-декабря, что позволит вам делать это официально и легко (без необходимости продления представления).

Но он пока недоступен, так что пока я разветвлял customFloatingActionButton от robertlevonyan, и с некоторыми небольшими изменениями он позволяет вам использовать свою собственную форму. Исходный код доступен здесь.

Чтобы добавить его в свой проект с помощью Gradle, вам нужно будет использовать jitpack. Вы можете добавить его так:

allprojects {
   repositories {
       ...
       maven { url 'https://jitpack.io' }
   }
}

Затем выполните мою вилку:

implementation 'com.github.JediBurrell:customFloatingActionButton:-SNAPSHOT'

Затем мы создадим форму, созданная вами должна работать нормально.

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="rectangle">
    <corners
        android:topLeftRadius="@dimen/fab_circle_radius"
        android:topRightRadius="@dimen/fab_circle_radius"
        android:bottomRightRadius="@dimen/fab_circle_radius" />
    <solid android:color="@color/colorAccent" />
</shape>

Затем, наконец, добавьте его в свой макет (больше параметров FAB перечислены в репозитории Github):

<com.jediburrell.customfab.FloatingActionButton
    android:id="@+id/floating_action_button"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_gravity="bottom|right"
    android:layout_margin="16dp"
    app:fabType="custom"
    app:fabShape="@drawable/fab_teardrop"
    app:fabIcon="@drawable/ic_add_24dp"
    app:fabColor="@color/red" />

И вот как это выглядит:

Ответ 2

Что вы ищете, это изменение фона вашей кнопки

android:background="@drawable/my_shape"

Ответ 3

В вашем вопросе вы сказали, что пытались настроить android:src, что, очевидно, неверно, потому что это касается контента для FloatingActionButton.

Параметр android:background изменит вашу форму. Обратите внимание, что он должен быть круглым.

Я думаю, что этот вопрос просто не дублируется, потому что другой вопрос касается только цвета.

Вам нужно будет использовать это в своем XML файле:

android:background="@drawable/my_shape"