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

Эй, наконец-то они это сделали. Наверное, это лучший способ использовать его сейчас. Спасибо, что поделился.
товарищ

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>

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


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

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

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.