Android — стилизация фона текстового поля

avatar
ASN
8 апреля 2018 в 10:43
1216
1
0

Я пытаюсь добиться стиля текстового поля, похожего на изображение ниже. enter image description here

Я попытался создать текстовое представление динамически, и у меня получилось что-то вроде этого. Может ли кто-нибудь помочь мне добиться стиля, похожего на изображение выше?

enter image description here

Ниже приведен блок кода, который я использовал для достижения вышеуказанного стиля.

chat_bubble.xml

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
    android:shape="rectangle">
    <solid android:color="#D8000000" />
    <corners android:bottomLeftRadius="1dp" android:radius="4dp" />
</shape>

Activity.kt

fun createTextView(activity: PlacesActivity){
    var textView = TextView(this)
        textView.setText("Text ABCDD")
        textView.textSize = 24F
        textView.alpha = 0F
        textView.setTextColor(Color.MAGENTA)

        textView.setBackgroundResource(R.drawable.chat_bubble)
        textView.setPadding(10,10,10,10)
        var params =
                LinearLayout.LayoutParams(LinearLayout.LayoutParams.WRAP_CONTENT,
                        LinearLayout.LayoutParams.WRAP_CONTENT);
        params.setMargins(50,50,50,50)

        textView.setLayoutParams(params)
        linearLayout.addView(textView, params);

        fadeMarker(textView)

}

Заранее спасибо.

Источник

Ответы (1)

avatar
bko
8 апреля 2018 в 12:09
1

Создайте фигуру для фона чата:

shape_pill_background.xml

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
    android:shape="rectangle">
    <corners
        android:bottomLeftRadius="40dp"
        android:bottomRightRadius="40dp"
        android:radius="40dp"
        android:topLeftRadius="40dp"
        android:topRightRadius="40dp" />
    <solid android:color="#555555" />
    <padding
        android:bottom="0dp"
        android:left="0dp"
        android:right="0dp"
        android:top="0dp" />

    <size android:height="40dp" />
</shape>

создайте рисуемую стрелку:

shape_arrow_down.xml

<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
    <item>
        <rotate
            android:fromDegrees="45"
            android:pivotX="230%"
            android:pivotY="30%"
            android:toDegrees="45">
            <shape android:shape="rectangle">
                <solid android:color="#555555" />
            </shape>
        </rotate>
    </item>
</layer-list>

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

<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <android.support.constraint.ConstraintLayout
        android:id="@+id/constraintLayoutTextBubble"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginEnd="8dp"
        android:layout_marginStart="8dp"
        android:layout_marginTop="8dp"
        android:background="@drawable/shape_pill_background"
        android:padding="16dp"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent">

        <TextView
            android:id="@+id/textViewInput"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginBottom="8dp"
            android:layout_marginEnd="8dp"
            android:layout_marginStart="8dp"
            android:layout_marginTop="8dp"
            android:background="#919191"
            android:padding="4dp"
            android:text="This is a text message"
            app:layout_constraintBottom_toBottomOf="parent"
            app:layout_constraintEnd_toStartOf="@+id/imageViewArrow"
            app:layout_constraintHorizontal_chainStyle="packed"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintTop_toTopOf="parent" />

        <ImageView
            android:id="@+id/imageViewArrow"
            android:layout_width="32dp"
            android:layout_height="32dp"
            android:layout_marginEnd="8dp"
            app:layout_constraintBottom_toBottomOf="@+id/textViewInput"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintHorizontal_bias="0.5"
            app:layout_constraintStart_toEndOf="@+id/textViewInput"
            app:layout_constraintTop_toTopOf="@+id/textViewInput"
            app:srcCompat="@drawable/ic_arrow_forward_wattle_24dp" />
    </android.support.constraint.ConstraintLayout>

    <View
        android:id="@+id/viewDownArrow"
        android:layout_width="22dp"
        android:layout_height="40dp"
        android:layout_marginEnd="8dp"
        android:layout_marginStart="8dp"
        android:background="@drawable/shape_arrow_down"
        app:layout_constraintEnd_toEndOf="@+id/constraintLayoutTextBubble"
        app:layout_constraintStart_toStartOf="@+id/constraintLayoutTextBubble"
        app:layout_constraintTop_toBottomOf="@+id/constraintLayoutTextBubble" />
</android.support.constraint.ConstraintLayout>

Результат будет выглядеть следующим образом:

enter image description here

Однако с этим есть несколько проблем. Когда у вас есть довольно большое сообщение, оно вытолкнет стрелку ImageView из пузыря из-за того, как wrap_content работает в цепочках и макете ограничений. Я предлагаю вам попробовать дать вашему сообщению TextView фиксированную ширину или установить ее ширину в соответствии с ограничениями. Это придаст вашему тексту серый фон там, где текста нет. Поиграйте с ним и посмотрите, что лучше всего подходит для вас.

ASN
8 апреля 2018 в 14:35
0

Спасибо бко. Но я пытаюсь создать все это динамически. (поскольку на основе вывода json количество текстовых представлений в прокручиваемом макете может измениться.) Поэтому я боюсь, что это не так просто, как использовать файл макета. Но да, еще раз спасибо за код. Я попытаюсь использовать это и попытаться создать их динамически.