Как показать фон просмотра карты как прогресс в Android? - PullRequest
0 голосов
/ 30 июня 2019

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

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

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

Ответы [ 3 ]

0 голосов
/ 30 июня 2019

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

 <?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>

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

0 голосов
/ 30 июня 2019

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

Дочерние представлениянарисованный в стеке, с последним добавленным потомком сверху.Размер FrameLayout - это размер его самого большого дочернего элемента (плюс заполнение), видимый или нет (если позволяет родительский элемент FrameLayout).Представления View.GONE используются для определения размера только в том случае, если для setConsiderGoneChildrenWhenMeasuring () задано значение 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)
0 голосов
/ 30 июня 2019

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

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

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

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

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

...