Как показать фон просмотра карты, например, прогресс в Android?

Я хочу установить app:cardBackgroundColor из CardView следующим образом:

<-----x----->
|-----------|------|
| color1    |color2|
|-----------|------|

где x - процент CardView, имеющих color1, По умолчанию весь цвет фона должен быть color2, Как установить это динамически в коде? (желательно Kotlin)

Вы можете установить макеты в карточке. Дайте им идентификатор и измените цвет фона. Это лучше, чем использовать cardbackgroundcolor

JDevoloper 30.06.2019 14:48

какой тип макетов? если вы говорите о макете View, его цвет переопределяет содержимое карты...

Akshdeep Singh 30.06.2019 15:27
0
2
396
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Хорошо, вам придется провести больше исследований, проб и ошибок; но для начала единственные способы, которыми вы сможете это сделать, о которых я могу думать, это:

  1. Создание пользовательского градиента во время выполнения, выбирая значение из «x», которое вы определяете. (*)

  2. Создайте class CustomCardView: CardView(), который переопределяет onDraw, или любой другой метод, который вы считаете подходящим для рисования фона, также потребуется значение «x» (*)

  3. Объедините оба решения, и ваш CustomCardView создаст градиент во время выполнения и установит его в качестве фона, используя код из 1 и 2 выше.

(*) если «x» является динамическим значением, которое вы хотите, чтобы люди изменяли во время разработки с помощью XML, вам нужно будет создать настраиваемый атрибут и попросить CustomCardView выбрать/прочитать значение, если оно существует.

Я имел в виду в комментариях, что вам это может понравиться;

 <?xml version = "1.0" encoding = "utf-8"?>
<android.support.v7.widget.CardView xmlns:android = "http://schemas.android.com/apk/res/android"
    xmlns:app = "http://schemas.android.com/apk/res-auto"
    xmlns:tools = "http://schemas.android.com/tools"
    android:layout_width = "match_parent"
    android:layout_height = "150dp"
    app:cardCornerRadius = "16dp"
    tools:context = ".MainActivity">

    <RelativeLayout
        android:layout_width = "match_parent"
        android:layout_height = "150dp">

        <LinearLayout
            android:id = "@+id/left_side"
            android:layout_width = "match_parent"
            android:layout_height = "150dp"
            android:layout_toStartOf = "@+id/right_side"
            android:layout_toLeftOf = "@+id/right_side"
            android:background = "@color/colorPrimary"
            android:orientation = "vertical" />

        <LinearLayout
            android:id = "@+id/right_side"
            android:layout_width = "150dp"
            android:layout_height = "150dp"
            android:layout_alignParentEnd = "true"
            android:layout_alignParentRight = "true"
            android:background = "@color/colorPrimaryDark"
            android:orientation = "vertical" />
    </RelativeLayout>

</android.support.v7.widget.CardView>

Вы можете изменить макеты или ширину и высоту карты, как вы хотите. Надеюсь это поможет.

Ответ принят как подходящий

Я думаю, что самый простой способ сделать это — поместить содержимое CardView внутрь FrameLayout, как согласно документы:

Child views are drawn in a stack, with the most recently added child on top. The size of the FrameLayout is the size of its largest child (plus padding), visible or not (if the FrameLayout's parent permits). Views that are View.GONE are used for sizing only if setConsiderGoneChildrenWhenMeasuring() is set to true.

Предположим, это макет CardView:

<androidx.cardview.widget.CardView>
    <!-- your contents -->
</androidx.cardview.widget.CardView>

Измените его на:

<androidx.cardview.widget.CardView>
    <FrameLayout>
        <LinearLayout android:orientation = "horizontal">
            <View
                android:id = "@+id/left"
                android:layout_width = "0dp"
                android:layout_height = "match_parent"
                android:layout_weight = "0" 
                android:background = "color1"/>
            <View
                android:id = "@+id/right"
                android:layout_width = "0dp"
                android:layout_height = "match_parent"
                android:layout_weight = "100" 
                android:background = "color2"/>
        </LinearLayout>
        <!-- your contents -->
    </FrameLayout>
</androidx.cardview.widget.CardView>

И в коде:

findViewById<View>(R.id.left).layoutParams = LinearLayout.LayoutParams(
    0, LinearLayout.LayoutParams.MATCH_PARENT, x)
findViewById<View>(R.id.right).layoutParams = LinearLayout.LayoutParams(
    0, LinearLayout.LayoutParams.MATCH_PARENT, 100f - x)

Другие вопросы по теме