Различные значения углового радиуса для MaterialCardView

Возможно ли иметь разные значения для каждого углового радиуса MaterialCardView? И если да, то как?

Я пробовал что-то вроде кода ниже, но, похоже, это не имеет никакого эффекта.

    float radius = getContext().getResources().getDimension(R.dimen.default_corner_radius);
    ShapePathModel leftShapePathModel = new ShapePathModel();
    leftShapePathModel.setTopLeftCorner(new RoundedCornerTreatment(radius));
    leftShapePathModel.setTopRightCorner(new RoundedCornerTreatment(radius));
    MaterialShapeDrawable bg = new MaterialShapeDrawable(leftShapePathModel);
    container.setBackground(bg);

где контейнер

@BindView(R.id.container) MaterialCardView container;

comment
вместо публикации ссылки опубликуйте относительный код, который вы пробовали.   -  person karan    schedule 14.02.2019
comment
Готово, извините! :)   -  person Tudor S.    schedule 14.02.2019
comment
Во-первых, всегда публикуйте свой код в вопросе. Во-вторых, вы проверили все решения на Stackoverflow? Вы пробовали это: stackoverflow.com/questions/29342633/cardview-corner-radius< /а>   -  person Douglas Cunha    schedule 14.02.2019
comment
Я видел этот пост, однако я надеялся, что есть лучшее решение, чем вложение двух карточек. Я нашел эту проблему issuetracker.google.com/issues/117662587, которая, похоже, решает мою проблему, но Я не слишком уверен, как его использовать, и я не нашел много документации по нему.   -  person Tudor S.    schedule 14.02.2019


Ответы (4)


Вы можете использовать пользовательский стиль и атрибут shapeAppearanceOverlay.

  <style name="MyCardView" parent="@style/Widget.MaterialComponents.CardView">
    <item name="shapeAppearanceOverlay">@style/ShapeAppearanceOverlay.MaterialCardView.Cut</item>
  </style>


  <style name="ShapeAppearanceOverlay.MaterialCardView.Cut" parent="">
    <item name="cornerFamily">rounded</item>
    <item name="cornerSizeTopRight">8dp</item>
    <item name="cornerSizeTopLeft">8dp</item>
    <item name="cornerSizeBottomRight">0dp</item>
    <item name="cornerSizeBottomLeft">0dp</item>
  </style>

или вы можете применить собственную ShapeAppearanceModel< /a> в угол карты, используя что-то вроде:

float radius = getResources().getDimension(R.dimen.my_corner_radius);
cardView.setShapeAppearanceModel(
  cardView.getShapeAppearanceModel()
      .toBuilder()
      .setTopLeftCorner(CornerFamily.ROUNDED,radius)
      .setTopRightCorner(CornerFamily.ROUNDED,radius)
      .setBottomRightCornerSize(0)
      .setBottomLeftCornerSize(0)
      .build());

введите описание изображения здесь

person Gabriele Mariotti    schedule 07.09.2019
comment
Показывает закругленные углы в студии Android, но на устройстве все прямоугольные! - person OhhhThatVarun; 13.09.2019
comment
@VarunRaj, вы используете 1.1.0-alpha10? Только что попробовал, и как с ShapeAppearanceModel, так и с shapeAppearanceOverlay со значениями в примере на Android P/Q результат тот же снимок экрана, прикрепленный к ответу. - person Gabriele Mariotti; 13.09.2019
comment
implementation 'com.google.android.material:material:1.1.0-alpha10' строка прямо из приложения. Будет работать только на P и Q? - person OhhhThatVarun; 13.09.2019
comment
Я только что видел это очень близко, закругленные углы есть, но видны только при перетаскивании моего нижнего листа. - person OhhhThatVarun; 13.09.2019
comment
Вы пытаетесь получить нижний лист с закругленными углами? - person Gabriele Mariotti; 13.09.2019
comment
Ага! Но мне также нужны тени, поэтому я подумал, что CardView будет простым и идеальным для этой работы. - person OhhhThatVarun; 13.09.2019
comment
@VarunRaj Вы также можете иметь roundCorners в нижнем листе с тем же атрибутом shapeAppearanceOverlay без использования карты. Вы также можете получить высоту, используя <item name="android:elevation" ns2:ignore="NewApi">xxdp</item> в стиле. Для постоянного BottomSheet вы можете проверить этот ответ, для модального вот этот. - person Gabriele Mariotti; 13.09.2019
comment
это не обрезает содержимое, поэтому прямоугольное содержимое выходит за пределы этих углов - person Jemshit Iskenderov; 25.12.2019

Попробуйте это также

     <style name="TopCornerCardview" parent="Widget.MaterialComponents.CardView">
        <item name="cornerFamily">rounded</item>
        <item name="cornerSizeTopRight">@dimen/dp25</item>
        <item name="cornerSizeTopLeft">@dimen/dp25</item>
        <item name="cornerSizeBottomRight">0dp</item>
        <item name="cornerSizeBottomLeft">0dp</item>
        <item name="contentPadding">0dp</item>
    </style>

    <com.google.android.material.card.MaterialCardView
            style="@style/TopCornerCardview"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:theme="@style/TopCornerCardview"
            app:cardBackgroundColor="@color/colorAccent"
            app:cardUseCompatPadding="true">

>
<!--views here-->
</com.google.android.material.card.MaterialCardView>
person Mujahid Khan    schedule 11.08.2020

Я думаю, вы должны иметь возможность звонить ShapeAppearanceModel shape = ((MaterialShapeDrawable)container.getBackground()).getShapeAppearanceModel() на свой MaterialCardView. Оттуда вы можете вызвать setTopLeftCorner() или другие методы, чтобы установить обработку углов с разными значениями. Возможно, вам придется вызвать container.invalidate() после установки углов.

person Cameron Ketcham    schedule 14.02.2019
comment
Спасибо за это, но, к сожалению, фон, возвращаемый MatericalCardView, не может быть преобразован в MaterialShapeDrawable. Однако аннулирование контейнера с использованием кода, который я опубликовал изначально, похоже, устранило проблему. - person Tudor S.; 18.02.2019
comment
Я думаю, что он может использовать LayerDrawable, чтобы обернуть его другими вещами. К сожалению, на данный момент похоже, что получить доступ к нему не так просто. Мы работаем над тем, чтобы упростить каждый компонент. - person Cameron Ketcham; 19.02.2019

Мое первоначальное решение было правильным, но в нем отсутствовала одна строка:

float radius = getContext().getResources().getDimension(R.dimen.default_corner_radius);
ShapePathModel leftShapePathModel = new ShapePathModel();
leftShapePathModel.setTopLeftCorner(new RoundedCornerTreatment(radius));
leftShapePathModel.setTopRightCorner(new RoundedCornerTreatment(radius));
MaterialShapeDrawable bg = new MaterialShapeDrawable(leftShapePathModel);
container.setBackground(bg);

Если вы добавите

container.invalidate()

как было предложено Кэмероном выше, похоже, это работает.

person Tudor S.    schedule 18.02.2019
comment
это не обрезает содержимое, поэтому прямоугольное содержимое выходит за пределы этих углов - person Jemshit Iskenderov; 25.12.2019