Я хочу установить app:cardBackgroundColor
из CardView
следующим образом:
<-----x----->
|-----------|------|
| color1 |color2|
|-----------|------|
где x
- процент CardView
, имеющих color1
,
По умолчанию весь цвет фона должен быть color2
,
Как установить это динамически в коде? (желательно Kotlin
)
какой тип макетов? если вы говорите о макете View
, его цвет переопределяет содержимое карты...
Хорошо, вам придется провести больше исследований, проб и ошибок; но для начала единственные способы, которыми вы сможете это сделать, о которых я могу думать, это:
Создание пользовательского градиента во время выполнения, выбирая значение из «x», которое вы определяете. (*)
Создайте class CustomCardView: CardView()
, который переопределяет onDraw
, или любой другой метод, который вы считаете подходящим для рисования фона, также потребуется значение «x» (*)
Объедините оба решения, и ваш 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)
Вы можете установить макеты в карточке. Дайте им идентификатор и измените цвет фона. Это лучше, чем использовать cardbackgroundcolor