FloatingActionButton с текстом вместо изображения

86

Я пытаюсь понять, как можно изменить FloatingActionButton из библиотеки поддержки Android. Можно ли использовать его с текстом вместо изображения?

Что-то вроде этого:

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

Я вижу, что он расширяет ImageButton, поэтому не думаю. Я прав?

Это правильно с точки зрения материального дизайна в целом?

товарищ
источник

Ответы:

26

С API 28 вы можете просто добавить текст в Fab, используя:

Посетите: https://material.io/develop/android/components/extended-floating-action-button/

 <com.google.android.material.floatingactionbutton.ExtendedFloatingActionButton
      android:layout_width="wrap_content"
      android:layout_height="wrap_content"
      android:layout_margin="8dp"
      android:contentDescription="@string/extended_fab_content_desc"
      android:text="@string/extended_fab_label"
      app:icon="@drawable/ic_plus_24px"
      app:layout_anchor="@id/app_bar"
      app:layout_anchorGravity="bottom|right|end"/>
Работа M
источник
Эй, наконец-то они это сделали. Наверное, это лучший способ использовать его сейчас. Спасибо, что поделился.
товарищ
java.lang.ClassNotFoundException: не удалось найти класс com.google.android.material.floatingactionbutton.ExtendedFloatingActionButton
Nirel
2
Из github.com/material-components/material-components-android вы должны использовать последнюю implementation 'com.google.android.material:material:1.1.0-alpha06'
Job M
1
он становится прямоугольником с круглым углом, как сделать его круглой кнопкой?
dx3906 07
1
@JobM Ты спас мне десятилетия. Спасибо
Moinkhan
101

Спасибо всем.

Вот простой способ решения этого вопроса. Правильно работает для Android 4+, для Android 5+ добавлен специальный параметр android: elevation для рисования TextView поверх FloatingActionButton.

<FrameLayout
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_gravity="bottom|right">

    <android.support.design.widget.FloatingActionButton
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:src="@android:color/transparent" />

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center"
        android:text="@android:string/ok"
        android:elevation="16dp"
        android:textColor="@android:color/white"
        android:textAppearance="?android:attr/textAppearanceMedium" />
</FrameLayout>
товарищ
источник
3
TextView показывает тень из-за свойств высоты,
Лавекуш Агравал
Попробуйте добавить атрибуты android:layout_margin="20dp"в FloatingActionButton, чтобы решить проблемы с тенями. В ожидании лучшего решения для этого
Long Ranger
добавить android:includeFontPadding="false"в TextViewтег для повышения производительности
android: elevation = "16dp" совместим только с API 21 и выше.
Red M
57

преобразовать текст в растровое изображение и использовать его. это очень просто.

fab.setImageBitmap(textAsBitmap("OK", 40, Color.WHITE));

//method to convert your text to image
public static Bitmap textAsBitmap(String text, float textSize, int textColor) {
    Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG);
    paint.setTextSize(textSize);
    paint.setColor(textColor);
    paint.setTextAlign(Paint.Align.LEFT);
    float baseline = -paint.ascent(); // ascent() is negative
    int width = (int) (paint.measureText(text) + 0.0f); // round
    int height = (int) (baseline + paint.descent() + 0.0f);
    Bitmap image = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);

    Canvas canvas = new Canvas(image);
    canvas.drawText(text, 0, baseline, paint);
    return image;
}
Нандан Кумар Сингх
источник
2
Отлично, но размер текста не меняется.
Ankur_009 06
1
@ Ankur_009 это меняется. Попробуйте увеличить значение на большой размер, поскольку оно находится в плавающем положении.
pratz9999 09
сладко, с небольшими изменениями я заставил его преобразовать шрифты значков в
чертежи
1
@ Ankur_009: место для кнопок ограничено, поэтому вы не видите изменения размера текста. Поэтому, если ваш текст уже занимает все пространство на кнопке, увеличение текста не даст никакого эффекта.
j3App
2
@ pratz9999 я даже установил его на 1000, но он все еще не меняется
Шивам Похриял
30

FAB обычно используются в CoordinatorLayouts. Вы можете использовать это:

<android.support.design.widget.CoordinatorLayout
     xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:app="http://schemas.android.com/apk/res-auto">

    <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:backgroundTint="@color/colorPrimary" />

      <TextView android:layout_height="wrap_content"
              android:layout_width="wrap_content"
              android:text="OK"
              android:elevation="6dp"
              android:textSize="18dp"
              android:textColor="#fff"
              app:layout_anchor="@id/fab"
              app:layout_anchorGravity="center"/>

</android.support.design.widget.CoordinatorLayout>

Это то, что работает

app:layout_anchor="@id/fab"
app:layout_anchorGravity="center"

Результат:

Результат

Если вы используете что-то layout_behaviorдля своего FAB, вам придется сделать аналогичный layout_behaviorдляTextView

Локешрмитра
источник
1
Получение ошибки android.support.design.widget.FloatingActionButton не может быть
преобразовано
1
Вы уверены, что ваш FloatingActionButton находится внутри CoordinatorLayout?
lokeshrmitra 06
1
@ Ankur_009 эта ошибка android.support.design.widget.FloatingActionButton cannot be cast to android.view.ViewGroup, вероятно, связана с тем , что вы поместили TextViewвнутрь FAB. Пожалуйста, свяжитесь с OP, где закрывается тег.
dumbfingers
Высота TextView также должна быть больше, чем у FAB, иначе он будет скрываться за FAB
Али Нем
Замечательный ответ !!
Sjd 09
18

Вы не можете установить текст для FloatingActionButtonиз библиотеки поддержки, но вы можете создать текстовое изображение прямо из студии Android:, File -> New -> Image Assetа затем использовать его для своей кнопки.

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

Малхэм Рэй
источник
5
Такие тексты, как «OK», «YES», «NO», «GO» идеально вписываются в FAB ..........
MarsAndBack
Для слов в FAB см. Расширенные вкладки: material.io/design/components/…
Майк Маргулис
8

Мне нужен текст в FAB, но вместо этого я просто выбрал TextView с круговым рисованным фоном:

  <TextView
        android:layout_margin="10dp"
        android:layout_gravity="right"
        android:gravity="center"
        android:background="@drawable/circle_background"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textColor="#FFF"
        android:textStyle="bold"
        android:fontFamily="sans-serif"
        android:text="AuthId"
        android:textSize="15dp"
        android:elevation="10dp"/>

Вот вариант (circle_backgroung.xml):

<?xml version="1.0" encoding="utf-8"?>
<shape
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:shape="oval">

<solid
    android:color="#666666"/>

<size
    android:width="60dp"
    android:height="60dp"/>
</shape>

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

Derwrecked
источник
2
При таком решении анимации ряби нет
Влад
2

Ответ @NandanKumarSingh https://stackoverflow.com/a/39965170/5279156 работает, но я внес некоторые изменения с помощью fab в код (не xml, потому что они будут перезаписаны в методах класса)

fab.setTextBitmap("ANDROID", 100f, Color.WHITE)
fab.scaleType = ImageView.ScaleType.CENTER
fab.adjustViewBounds = false

Где setTextBitmapрасширение для ImageViewкласса с аналогичной функциональностью, но поддерживает многострочный текст

fun ImageView.setTextBitmap(text: String, textSize: Float, textColor: Int) {
    val paint = Paint(Paint.ANTI_ALIAS_FLAG)
    paint.textSize = textSize
    paint.color = textColor
    paint.textAlign = Paint.Align.LEFT
    val lines = text.split("\n")
    var maxWidth = 0
    for (line in lines) {
        val width = paint.measureText(line).toInt()
        if (width > maxWidth) {
            maxWidth = width
        }
    }
    val height = paint.descent() - paint.ascent()
    val bitmap = Bitmap.createBitmap(maxWidth, height.toInt() * lines.size, Bitmap.Config.ARGB_8888)
    val canvas = Canvas(bitmap)
    var y = - paint.ascent()
    for (line in lines) {
        canvas.drawText(line, 0f, y, paint)
        y += height
    }
    setImageBitmap(bitmap)
}
Влад
источник
1

Я использовал CardView для достижения того же результата

  <androidx.cardview.widget.CardView
            android:layout_width="@dimen/dp80"
            android:layout_height="@dimen/dp80"
            android:layout_gravity="center_horizontal"
            app:cardElevation="@dimen/dp8"
            android:layout_marginBottom="@dimen/dp16"
            android:layout_marginTop="@dimen/dp8"
            app:cardBackgroundColor="@color/colorWhite100"
            app:cardCornerRadius="@dimen/dp40">

            <TextView
                style="@style/TextAppearance.MaterialComponents.Headline4"
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                android:layout_gravity="center_horizontal"
                android:background="@drawable/shape_go_bg"
                android:text="GO"
                android:gravity="center"
                android:textColor="@color/colorWhite100" />
        </androidx.cardview.widget.CardView>
Арьэтей Соломон Арьэти
источник
0

Очень небольшая модификация ответа товарища , чтобы поддержать его для Android API ниже 21, просто добавьте app:elevation="0dp"вFloatingActionButton

Это может помочь другим!

Балрам Кукрежа
источник