Пример FloatingActionButton с библиотекой поддержки

Недавно я прочитал эти сообщения:

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

Android Support Library, версия 22.2.0

FloatingActionButton

Но ни один из них не дает мне подробного примера о создании нового FloatingActionButton. Так трудно понять, я задаю этот вопрос.

Может ли кто-нибудь дать мне пример об этом?

Любая помощь очень ценится. Спасибо заранее.

ИЗМЕНИТЬ

Я только что нашел некоторые проблемы в FloatingActionButton (FAB), и я хочу улучшить другой ответ. См. Мой ответ ниже.

Ответ 1

Итак, в вашем файле 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'

Затем, в вашем styles.xml 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>

Вы можете увидеть больше параметров в документации (setRippleColor и т.д.), Но один из примечаний:

    app:fabSize="mini"

Еще один интересный one-- для изменения цвета фона только одного FAB, добавьте:

    app:backgroundTint="#FF0000"

(например, чтобы изменить его на красный) на XML выше.

Во всяком случае, в коде, после того, как представление Activity/Fragment надувается....

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

Замечания:

  • Если у вас есть одна из тех кнопок, которые в "шве" разделяют два вида (например, с помощью RelativeLayout) с, скажем, отрицательным нижним полем макета для перекрытия границы, вы заметите проблему: размер FAB на самом деле очень отличается на леденец против pre-lollipop. Это можно увидеть в редакторе визуального макета AS, когда вы переключаетесь между APIs--, и он внезапно "выдыхается", когда вы переключаетесь в режим pre-lollipop. Кажется, причиной дополнительного размера является то, что тень расширяет размер вида в каждом направлении. Таким образом, вы должны учитывать это при настройке полей 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 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"/>
    

Помните, что вы можете автоматически заставить кнопку выпрыгивать, когда появляется Snackbar, оборачивая ее в CoordinatorLayout.

Больше:

Ответ 2

Я только что нашел некоторые проблемы в 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

enter image description here

И код из 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 -->

Для уровня API 21 и выше задайте край справа и снизу до 24dp:

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

Руководства по проектированию FloatingActionButton

Как вы можете видеть на моем коде HTML-кода выше, я установил:

        ...
        android:layout_alignParentBottom="true"
        android:layout_alignParentRight="true"
        app:elevation="6dp"
        app:pressedTranslationZ="12dp"
        ...
  • Установив эти атрибуты, вам не нужно снова устанавливать layout_marginTop и layout_marginRight (только на pre-Lollipop). Android автоматически разместит его на правой стороне экрана, что аналогично обычным FAB в Android Lollipop.

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

Или вы можете использовать это в CoordinatorLayout:

        android:layout_gravity="end|bottom"
  • Вам нужно иметь 6dp elevation и 12dp pressedTranslationZ, в соответствии с это руководство от Google.

Правила FAB

Ответ 3

FloatingActionButton extends 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" />