【问题标题】:Android CardView remove paddingAndroid CardView 移除内边距
【发布时间】:2015-07-08 17:26:57
【问题描述】:

如何在下面的布局中去掉这个奇怪的填充:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:card_view="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    android:background="@color/ColorPrimaryDark">

    <android.support.v7.widget.CardView
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        card_view:cardCornerRadius="10dp"
        android:layout_marginTop="9dp"
        android:layout_marginLeft="9dp"
        android:layout_marginRight="9dp"
        card_view:cardElevation="0.01dp"
        android:layout_marginBottom="0dp"
        card_view:cardPreventCornerOverlap="true"
        card_view:cardUseCompatPadding="true"
        card_view:cardBackgroundColor="@color/ColorPrimary">

        <RelativeLayout
            android:id="@+id/top_layout"
            android:layout_width="fill_parent"
            android:layout_height="180dp"
            android:background="@color/ColorPrimary">

            <ImageView
                android:id="@+id/img_thumbnail"
                android:layout_width="fill_parent"
                android:layout_height="180dp"
                android:scaleType="fitXY"
                android:background="@drawable/korabltest"/>

            <RelativeLayout
                android:id="@+id/inner_layout"
                android:layout_width="fill_parent"
                android:layout_height="36dp"
                android:background="#5c1b1b1b"
                android:layout_gravity="bottom"
                android:layout_alignParentBottom="true"
                android:layout_alignParentLeft="true"
                android:layout_alignParentStart="true">

                <TextView
                    android:id="@+id/tv_nature"
                    android:layout_width="wrap_content"
                    android:layout_height="50dp"
                    android:paddingLeft="5dp"
                    android:paddingRight="5dp"
                    android:layout_gravity="bottom"
                    android:gravity="center_vertical"
                    android:alpha="0.8"
                    android:textColor="#fff"
                    android:textSize="18sp"
                    android:text="Lexington"
                    android:layout_alignParentLeft="true"
                    android:layout_alignParentStart="true" />

                <TextView
                    android:id="@+id/tv_nature_1"
                    android:layout_width="wrap_content"
                    android:layout_height="50dp"
                    android:paddingLeft="5dp"
                    android:paddingRight="5dp"
                    android:layout_gravity="bottom"
                    android:gravity="center_vertical"
                    android:alpha="0.8"
                    android:textColor="#fff"
                    android:textSize="18sp"
                    android:textStyle="bold"
                    android:text="527 (31%)"
                    android:layout_alignParentBottom="true"
                    android:layout_alignParentRight="true"
                    android:layout_alignParentEnd="true" />
            </RelativeLayout>
        </RelativeLayout>
    </android.support.v7.widget.CardView>

</LinearLayout>

【问题讨论】:

  • 你说的是卡片之间的填充吗?

标签: android android-cardview


【解决方案1】:

UDPATE

好吧,似乎有一种更简单的方法可以做到这一点,而无需猜测填充和所有内容:

card_view:cardPreventCornerOverlap="false"

或使用java:

cardView.setPreventCornerOverlap(false)

您可以阅读所有相关信息here

原始答案

这是一种有意的填充,以避免在棒棒糖之前的版本中内容从卡片的圆角溢出(因为剪辑不可用)。如果您想一起摆脱它,您可以在棒棒糖前版本中为CardViewcontentPadding 属性使用负填充,例如:

card_view:contentPadding="-8dp"

或使用java:

int padding = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 8, getResources().getDisplayMetrics());
cardView.setContentPadding(-padding,-padding,-padding,-padding);

我不确定哪个值可以无缝运行,您需要自己试验并查看。

【讨论】:

  • 感谢您的回答,但是在将 card_view:cardPreventCornerOverlap 更改为 false 后,圆角完全消失了,而不仅仅是一个正方形。
  • @IvanFazaniuk 是的,我没有尝试cardPreventCornerOverlap 属性。也可以通过显式设置cardCornerRadius 来尝试。可能会奏效。如果没有,否定的contentPadding 将起到作用:角落完好无损。我自己也试过了。
  • 有没有办法在 XML 中做到这一点?
  • 忽略最后一条评论
  • @fahmy contentPadding 仅将您的内容设置在卡片边距上。如果您将 cardPreventCornerOverlap 设置为 false,您基本上会得到一张卡片,其上的高程阴影被其负填充内容所覆盖。
【解决方案2】:

请从您的代码中删除它 -

card_view:cardUseCompatPadding="true"

【讨论】:

    【解决方案3】:

    遇到了同样的问题,this 为我工作。

    app:cardPreventCornerOverlap="false"
    

    对于 API

    @Override
    protected void onDraw(Canvas canvas) {
        float radius = getContext().getResources().getDimension(R.dimen.card_corner_radius);
        Path path = new Path();
        RectF rect = new RectF(0, 0, this.getWidth(), this.getHeight());
        path.addRoundRect(rect, radius, radius, Path.Direction.CW);
        canvas.clipPath(path);
        super.onDraw(canvas);
    }
    

    【讨论】:

    • 重用你的 Path 实例怎么样?
    【解决方案4】:

    使用这个:

    cardView.setPadding(0,0,0,0);
    cardView.setUseCompatPadding(true);
    cardView.setContentPadding(-6,-6,-6,-6);
    cardView.setPreventCornerOverlap(false);
    

    【讨论】:

      【解决方案5】:

      我之前专门定义了cardview的高度——改成“wrap_content”后,问题就解决了。

      【讨论】: