web-dev-qa-db-ja.com

コーナー半径が異なるCardView

次のCardViewがあり、カードの各コーナーに異なる半径を設定したいと思います。 XMLまたはプログラムによってそれらを変更することは可能ですか?前もって感謝します。

<Android.support.v7.widget.CardView 
    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="wrap_content"
    Android:layout_marginRight="16dp"
    Android:layout_marginLeft="16dp"
    Android:layout_marginTop="5dp"
    Android:layout_marginBottom="5dp"
    app:cardCornerRadius="0dp"
    app:cardElevation="0dp">
</Android.support.v7.widget.CardView>

[〜#〜] edit [〜#〜]Avinashが示唆するように、このlibの動作を探しています github.com/ captain-miao/OptionRoundCardview ですが、デフォルトのCardViewアイテムを使用しています。個別に変更できない場合は、このlibが適切なアプローチです。

11
Juanje

公式の MaterialCardViewandroidx.cardview.widget.CardView )および Material Components Library のバージョン1.1.0

レイアウトにMaterialCardViewを追加します。

    <com.google.Android.material.card.MaterialCardView
        style="@style/CustomCardViewStyle"
        ...>

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

マテリアルカードスタイル を継承するカスタムスタイルを定義します(例:Widget.MaterialComponents.CardView)およびshapeAppearanceOverlay属性を使用:

  <style name="CustomCardViewStyle" parent="@style/Widget.MaterialComponents.CardView">
     <item name="shapeAppearanceOverlay">@style/ShapeAppearanceOverlay_card_custom_corners</item>
  </style>


  <style name="ShapeAppearanceOverlay_card_custom_corners" parent="">
    <item name="cornerFamily">rounded</item>
    <item name="cornerSizeTopRight">4dp</item>
    <item name="cornerSizeTopLeft">8dp</item>
    <item name="cornerSizeBottomRight">16dp</item>
    <item name="cornerSizeBottomLeft">0dp</item>
  </style>

enter image description here

プログラムで実現することもできます。
カードの角にカスタム ShapeAppearanceModel を適用するだけです。
何かのようなもの:

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

注:ライブラリのバージョン1.1.0が必要です。現在:

implementation 'com.google.Android.material:material:1.1.0'
19

カスタムxmlを作成して、次のようにrounded_corners.xmlという名前を付けることができます。

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:Android="http://schemas.Android.com/apk/res/Android">
<corners Android:radius="1dp"
    Android:topLeftRadius="20dp"
    Android:topRightRadius="30dp"
    Android:bottomLeftRadius="40dp"
    Android:bottomRightRadius="50dp"/>
<solid Android:color="your_background_color" />
</shape>

次に、これをCardViewの背景として使用します。

Android:background="@drawable/rounded_corners"

編集:これがCardView以外のすべてのビューで機能することに気付いたので、 を参照してください回避策の実行方法を確認するためのこの質問

3
Vucko

こんにちは、次のコードを使用して、プログラムまたはxmlで追加できます。

app:cardCornerRadius="0dp"// xml
cardView.setRadius(0);

これは標高を探している余分な人です

app:cardElevation="0.7dp"//xml
app:cardMaxElevation="1dp"//xml
cardView.setCardElevation(2.1f);//code
cardView.setMaxCardElevation(3f);//code

CardViewのXMLの完全なJava表現。

CardView cardView = (CardView) findViewById(R.id.cardView);
cardView.setUseCompatPadding(true);
cardView.setContentPadding(30, 30, 30, 0);
cardView.setPreventCornerOverlap(true);
cardView.setCardBackgroundColor(Color.WHITE);
cardView.setCardElevation(2.1f);
cardView.setRadius(0);
cardView.setMaxCardElevation(3f);
0