Приклад FloatingActionButton з бібліотекою підтримки


129

Нещодавно я прочитав ці пости:

Бібліотека підтримки дизайну Android

Бібліотека підтримки Android, версія 22.2.0

Плаваюча Дія Кнопка

Але жоден з них не дає мені детального прикладу щодо створення нового FloatingActionButton. Так важко зрозуміти, я задаю це питання.

Хтось може надати мені приклад про це?

Будь-яка допомога дуже вдячна. Заздалегідь спасибі.

EDIT

Щойно я знайшов деякі питання FloatingActionButton(FAB), і я хочу вдосконалити ще одну відповідь. Дивіться мою відповідь нижче.


Відповіді:


274

Отже, у своєму build.gradleфайлі додайте це:

compile 'com.android.support:design:27.1.1'

AndroidX Примітка: Google представляє нові бібліотеки розширень AndroidX, щоб замінити старі бібліотеки підтримки. Щоб використовувати AndroidX, спочатку переконайтеся , що ви оновили свій gradle.propertiesфайл , відредагований build.gradleв набір , compileSdkVersionщоб 28(або вище), і такий рядок замість попередніх compileодин.

implementation 'com.google.android.material:material:1.0.0'

Далі, в вашому themes.xmlабо styles.xmlабо будь-який інший , переконайтеся , що ви встановили this- це вашого застосування акцент color-- і колір вашого FAB , якщо не перевизначити його (дивіться нижче):

        <item name="colorAccent">@color/floating_action_button_color</item>

У XML макета:

<RelativeLayout
 ...
 xmlns:app="http://schemas.android.com/apk/res-auto">

       <android.support.design.widget.FloatingActionButton
            android:id="@+id/myFAB"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:src="@drawable/ic_plus_sign"
            app:elevation="4dp"
            ... />

</RelativeLayout>

Або якщо ви використовуєте бібліотеку матеріалів AndroidX вище, замість цього скористайтеся цим:

<RelativeLayout
 ...
 xmlns:app="http://schemas.android.com/apk/res-auto">

       <com.google.android.material.floatingactionbutton.FloatingActionButton
            android:id="@+id/myFAB"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:srcCompat="@drawable/ic_plus_sign"
            app:elevation="4dp"
            ... />

</RelativeLayout>

Більше варіантів можна побачити в документах (тут ви знайдете матеріальні документи) ( setRippleColorтощо), але одна з приміток:

    app:fabSize="mini"

Ще один цікавий варіант - щоб змінити колір фону лише одного FAB, додайте:

    app:backgroundTint="#FF0000"

(наприклад, змінити його на червоний) у XML вище.

У будь-якому випадку, у коді, після того, як перегляд Діяльності / Фрагменту завищений ....

    FloatingActionButton myFab = (FloatingActionButton)  myView.findViewById(R.id.myFAB);
    myFab.setOnClickListener(new View.OnClickListener() {
        public void onClick(View v) {
            doMyThing();
        }
    });

Спостереження:

  • Якщо у вас є одна з цих кнопок, яка знаходиться на "шві", розділяючи два види (наприклад, використовуючи RelativeLayout) з, скажімо, від'ємним нижнім полем макета для перекриття межі, ви помітите проблему: розмір FAB насправді дуже різні від льодяника проти попереднього льодяника. Це насправді можна побачити у візуальному редакторі компонування AS, коли ви переходите між API-програмами - воно раптово «вихлюпується», коли ви переходите на попередній льодяник. Причина додаткового розміру, здається, полягає в тому, що тінь розширює розмір виду в кожному напрямку. Тому вам доведеться враховувати це, коли ви коригуєте маржу FAB, якщо вона близька до інших речей.
  • Ось спосіб видалити або змінити прокладки, якщо їх занадто багато:

    if (Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP) {
        RelativeLayout.LayoutParams p = (RelativeLayout.LayoutParams) myFab.getLayoutParams();
        p.setMargins(0, 0, 0, 0); // get rid of margins since shadow area is now the margin
        myFab.setLayoutParams(p);
    }
  • Крім того, я збирався програмно розмістити FAB на "шві" між двома областями в RelativeLayout, захопивши висоту FAB, розділившись на два, і використавши це як зміщення поля. Але myFab.getHeight () повернув нуль, навіть після того, як перегляд був завищений, здавалося. Натомість я використав ViewTreeObserver, щоб отримати висоту лише після того, як він викладений, а потім встановити положення. Дивіться цю пораду тут . Виглядало так:

        ViewTreeObserver viewTreeObserver = closeButton.getViewTreeObserver();
        if (viewTreeObserver.isAlive()) {
            viewTreeObserver.addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
                @Override
                public void onGlobalLayout() {
                    if (Build.VERSION.SDK_INT < Build.VERSION_CODES.JELLY_BEAN) {
                        closeButton.getViewTreeObserver().removeGlobalOnLayoutListener(this);
                    } else {
                        closeButton.getViewTreeObserver().removeOnGlobalLayoutListener(this);
                    }
                    // not sure the above is equivalent, but that's beside the point for this example...
                    RelativeLayout.LayoutParams params = (RelativeLayout.LayoutParams) closeButton.getLayoutParams();
                    params.setMargins(0, 0, 16, -closeButton.getHeight() / 2); // (int left, int top, int right, int bottom)
                    closeButton.setLayoutParams(params);
                }
            });
        }

    Не впевнений, чи правильно це зробити, але, здається, працює.

  • Здається, ви можете зменшити тіньовий простір кнопки, зменшивши висоту.
  • Якщо ви хочете , FAB на «шов» ви можете використовувати layout_anchorі layout_anchorGravityось приклад:

    <android.support.design.widget.FloatingActionButton
        android:layout_height="wrap_content"
        android:layout_width="wrap_content"
        app:layout_anchor="@id/appbar"
        app:layout_anchorGravity="bottom|right|end"
        android:src="@drawable/ic_discuss"
        android:layout_margin="@dimen/fab_margin"
        android:clickable="true"/>

Пам’ятайте, що ви можете автоматично змусити кнопку стрибати з шляху, коли з'являється закусочна , загорнувши її в CoordinatorLayout .

Більше:


1
Звичайно. Просто додайте, android:backgroundTint="#FF0000"наприклад, до FloatingActionBar у XML. (додавання у відповідь)
жир

1
Хм. Гаразд, я потім його зміню. Дякую! Темний Леонхарт - Я нічого не бачив про вбудований швидкий зворот, але є зразки того, як це робити в інших місцях на stackoverflow, який, я вважаю, все ще працюватиме. Плюс є деякі бібліотеки, які також роблять це.
фініш

1
Цей компонент станом на 22.2.0, на мій погляд, не готовий до виробництва. Btw, може бути помилковим, але не використовуйте spу властивості евеляції. Це повинно бутиapp:elevation="4dp"
Жоао Суса

1
Зверніть увагу , якщо ви додаєте FloatingActionButtonдо CoordinatorLayout, ви можете використовувати app:layout_anchor="element_with_seam"і app:layout_anchorGravity="bottom|right|end"правильно розташувати FAB над швом - см розташування activity_detail від cheesesquare
ianhanniballake

2
@DarkLeonhart - ознайомтеся з моїм прикладом показу / приховування FAB на прокруті , розширивши його поведінку.
ianhanniballake

49

Щойно я знайшов деякі проблеми на FAB і хочу ще одну відповідь.


випуск setRippleColor

Отже, проблема виникне, як тільки ви програмно встановите колір пульсацій (колір FAB при натисканні) setRippleColor. Але ми все ще маємо альтернативний спосіб встановити його, тобто зателефонувавши:

FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab);
ColorStateList rippleColor = ContextCompat.getColorStateList(context, R.color.fab_ripple_color);
fab.setBackgroundTintList(rippleColor);

Ваш проект повинен мати таку структуру:

/res/color/fab_ripple_color.xml

введіть тут опис зображення

І код з fab_ripple_color.xml:

<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:state_pressed="true" android:color="@color/fab_color_pressed" />
    <item android:state_focused="true" android:color="@color/fab_color_pressed" />
    <item android:color="@color/fab_color_normal"/>
</selector>

Нарешті, трохи змініть свій FAB:

<android.support.design.widget.FloatingActionButton
    android:id="@+id/fab"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:src="@drawable/ic_action_add"
    android:layout_alignParentBottom="true"
    android:layout_alignParentRight="true"
    app:fabSize="normal"
    app:borderWidth="0dp"
    app:elevation="6dp"
    app:pressedTranslationZ="12dp"
    app:rippleColor="@android:color/transparent"/> <!-- set to transparent color -->

Для рівня 21 і вище API встановіть правий і нижній запас на 24dp:

...
android:layout_marginRight="24dp"
android:layout_marginBottom="24dp" />

Посібники з дизайну FloatingActionButton

Як видно з мого XML-коду FAB вище, я встановив:

        ...
        android:layout_alignParentBottom="true"
        android:layout_alignParentRight="true"
        app:elevation="6dp"
        app:pressedTranslationZ="12dp"
        ...
  • Встановлюючи ці атрибути, вам не потрібно встановлювати layout_marginTopі layout_marginRightзнову (лише на попередньому Lollipop). Android розмістить його автоматично в правій частині кута екрана, що аналогічно звичайній FAB в Android Lollipop.

        android:layout_alignParentBottom="true"
        android:layout_alignParentRight="true"

Або ви можете використовувати це в CoordinatorLayout:

        android:layout_gravity="end|bottom"

Правила FAB


5
великі пальці для проведених досліджень. плюс 1 для pressedTranslationZ. Я цього не знав.
Жоао Суса

app: elevation = "6dp" додаток: pressTranslationZ = "12dp" робить трюк для попереднього льодяника, але моя фабула знаходиться буквально на куті екрану на Lollipop
Thiago

1
Ви використовуєте неправильне значення для "Натиснутий ПерекладZ". Це не значення висоти на натиснутому стані. PresssedElevation = висота + натиснута трансляціяZ. Тож правильними значеннями є додаток: elevation = "6dp" додаток: натиснутоTranslationZ = "6dp"
e.shishkin

3
Насправді вам не потрібно встановлювати значення app:elevationта app:pressedTranslationZ. Їх значення за замовчуванням - це таке, яке визначено в інструкціях щодо проектування матеріалів. У будь-якому випадку, наприклад, Ешкішкін правий, значення є app:elevation:6dpі pressedTranslationZ:6dp. Перевірити це можна у вихідному коді
Крістіан Гарсія

12

FloatingActionButton розширюється ImageView . Отже, це просто, як, наприклад, введення ImageViewв ваш макет. Ось зразок XML

<android.support.design.widget.FloatingActionButton   xmlns:app="http://schemas.android.com/apk/res-auto"
    android:id="@+id/fab"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:src="@drawable/somedrawable"
    android:layout_gravity="right|bottom"
    app:borderWidth="0dp"
    app:rippleColor="#ffffff"/>

app:borderWidth="0dp" додається як вирішення проблем з висотою.


4

для AndroidX типу, як

<com.google.android.material.floatingactionbutton.FloatingActionButton
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    app:srcCompat="@drawable/ic_add" />

1

Якщо ви вже додали всі бібліотеки, і вона все ще не працює:

<com.google.android.material.floatingactionbutton.FloatingActionButton
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    app:srcCompat="@drawable/ic_add" 
/>

замість:

<android.support.design.widget.FloatingActionButton
   android:layout_width="wrap_content"
   android:layout_height="wrap_content"
   app:srcCompat="@drawable/ic_add"
 />

І все буде добре працювати :)

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.