CardView Radius и Drawable Shape Radius не совпадают - PullRequest
1 голос
/ 17 июня 2020

У меня ниже макет, который имеет CardView

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.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:background="@color/white"
    android:padding="50dp"
    >
  <androidx.cardview.widget.CardView
      android:layout_width="match_parent"
      android:layout_height="200dp"
      app:cardBackgroundColor="@android:color/holo_red_light"
      app:cardCornerRadius="50dp"
      app:cardElevation="0dp"
      app:layout_constraintTop_toTopOf="parent"
      >
    <View
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:background="@drawable/outline"
        />
  </androidx.cardview.widget.CardView>
</androidx.constraintlayout.widget.ConstraintLayout>

И мой @drawable/outline - это просто штрих с радиусом угла, таким же, как cardCornerRadius

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
  <corners android:radius="50dp" />
  <stroke
      android:width="3dp"
      android:color="@color/white" />
</shape>

Итак, Я ожидал CardView с контуром. Но это то, что я получаю

enter image description here

Почему радиус моего стока и радиус CardView не совпадают и как это исправить?

1 Ответ

3 голосов
/ 17 июня 2020

Проверьте эту проблему на MaterialCardView (но то же самое с androidx.cardview.widget.CardView)

Это связано с сглаживанием. Фон и обводка рисуются на одних и тех же пикселях , но в зависимости от цвета обводки прозрачные пиксели, добавленные AA, могут вызывать проступание. Вот почему вы не увидите его, если перевернете цвета здесь.

Вы можете добиться того же вида, просто используя

   <com.google.android.material.card.MaterialCardView
        app:cardBackgroundColor="@color/...."
        app:strokeWidth="3dp"
        app:strokeColor="@color/white />

enter image description here

Как видите:

enter image description here

У вас есть другой вариант.
Вы можете применить то же самое ShapeAppearanceModel ( предоставляется по умолчанию MaterialCardView) для простого View (или Layout) инвертирования цветов и с применением поля к внутреннему виду.

   <com.google.android.material.card.MaterialCardView
        app:cardCornerRadius="@dimen/corner_radius_16"
        app:cardBackgroundColor="@color/white">

        <View
            android:layout_margin="3dp"   
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:id="@+id/view_rounded"/>

    </com.google.android.material.card.MaterialCardView>

А потом:

float size = getResources().getDimension(R.dimen.cutout_size);

View viewRounded = findViewById(R.id.view_rounded);
ShapeAppearanceModel shapeAppearanceModelView = new ShapeAppearanceModel()
        .toBuilder()
        .setAllCorners(CornerFamily.ROUNDED,radius16)
        .build();
MaterialShapeDrawable shapeDrawableView = new MaterialShapeDrawable(shapeAppearanceModelView);
shapeDrawableView.setFillColor(ContextCompat.getColorStateList(this,R.color.xxx));
ViewCompat.setBackground(viewRounded,shapeDrawableView);

enter image description here

enter image description here

...