【问题标题】:Remove CardView Overdraw移除 CardView 透支
【发布时间】:2016-07-18 10:07:02
【问题描述】:

我尝试在我的应用程序上运行“调试 GPU 过度绘制”工具,以减少过度绘制的数量。如下图所示,cardview 就像一个额外的透支层。我没有为其他布局提供任何额外的背景颜色或图像。

有没有办法解决这个问题?

<?xml version="1.0" encoding="utf-8"?>
<android.support.v7.widget.CardView xmlns:card_view="http://schemas.android.com/apk/res-auto"
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/card_view"
    android:layout_width="match_parent"
    android:layout_height="350dp"
    card_view:cardCornerRadius="10dp"
    android:layout_margin="10dp">
    <RelativeLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent">
        <RelativeLayout
            android:layout_width="match_parent"
            android:layout_height="match_parent">
            <LinearLayout
                android:id="@+id/container_top"
                android:layout_width="match_parent"
                android:layout_height="60dp"
                android:background="#fff"
                android:layout_alignParentTop="true"
                android:orientation="horizontal">
                <RelativeLayout
                    android:layout_width="0dp"
                    android:layout_height="match_parent"
                    android:layout_weight="1">
                    <ImageView
                        android:id="@+id/thumbnail_profile"
                        android:layout_width="50dp"
                        android:layout_height="50dp"
                        android:scaleType="centerCrop"
                        android:layout_centerInParent="true"/>
                </RelativeLayout>
                <RelativeLayout
                    android:layout_width="0dp"
                    android:layout_height="match_parent"
                    android:layout_weight="3">
                    <LinearLayout
                        android:layout_width="wrap_content"
                        android:layout_height="wrap_content"
                        android:orientation="vertical"
                        android:layout_centerVertical="true"
                        android:layout_marginLeft="5dp">
                        <TextView
                            android:id="@+id/created_by"
                            android:textSize="13sp"
                            android:textStyle="bold"
                            android:layout_width="wrap_content"
                            android:layout_height="wrap_content"/>
                        <TextView
                            android:id="@+id/time_ago"
                            android:textSize="10sp"
                            android:layout_width="wrap_content"
                            android:layout_height="wrap_content"/>
                    </LinearLayout>
                </RelativeLayout>
                <RelativeLayout
                    android:layout_width="0dp"
                    android:layout_height="match_parent"
                    android:layout_weight="1">
                    <LinearLayout
                        android:layout_width="wrap_content"
                        android:layout_height="wrap_content"
                        android:orientation="horizontal"
                        android:layout_centerVertical="true"
                        android:layout_marginLeft="5dp">
                        <ImageView
                            android:id="@+id/likes_logo"
                            android:layout_width="wrap_content"
                            android:layout_height="wrap_content"
                            android:src="@drawable/ic_like_red"/>
                        <TextView
                            android:id="@+id/likes_product"
                            android:layout_width="wrap_content"
                            android:layout_height="wrap_content"
                            android:text="123"
                            android:layout_marginTop="5dp"/>
                    </LinearLayout>
                </RelativeLayout>
            </LinearLayout>
            <ImageView
                android:id="@+id/image"
                android:layout_width="match_parent"
                android:layout_height="230dp"
                android:layout_centerHorizontal="true"
                android:layout_below="@+id/container_top"
                android:scaleType="centerCrop"/>
            <RelativeLayout
                android:layout_width="match_parent"
                android:layout_height="60dp"
                android:background="#fff"
                android:layout_alignParentBottom="true">
                <TextView
                    android:id="@+id/brand_product"
                    android:textSize="24sp"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:singleLine="true"
                    android:layout_marginLeft="5dp"
                    android:layout_alignParentTop="true"/>
                <TextView
                    android:id="@+id/name_product"
                    android:textSize="18sp"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:singleLine="true"
                    android:layout_marginLeft="5dp"
                    android:layout_marginBottom="5dp"
                    android:layout_alignParentBottom="true"/>
            </RelativeLayout>
        </RelativeLayout>
    </RelativeLayout>
</android.support.v7.widget.CardView>

【问题讨论】:

  • 发布项目布局文件
  • 我编辑了问题并添加了xml布局文件
  • 为什么这么复杂?它可以简化为this
  • 通过去除上面和下面部分的背景颜色,我得到了更好的结果。谢谢!
  • @Selvin 我认为您应该发布要点作为答案。

标签: android performance


【解决方案1】:

您的LinearLayoutRelativeLayout 都有背景设置#fff。 删除它们,看看是否有帮助。

【讨论】:

    【解决方案2】:

    这可能是一种误解,因为这不是一些“过度绘制”,而是 硬件层 显示为绿色。如果您真的想禁用它,只需禁用View(甚至整个应用程序)的硬件加速:

    cardView.setLayerType(View.LAYER_TYPE_SOFTWARE, null);
    

    我的意思是,您可以尝试禁用它一次以查看绿色覆盖消失,然后再次删除该指令,以便重新打开硬件加速。如果它可能滞后,这可能还有另一个原因;例如:RecyclerViewScrollView 的组合在配置错误时可能会严重滞后。

    【讨论】:

      【解决方案3】:

      我有一个简单的 CardView 布局,如下所示,我也在观察卡片边框上的过度绘制。

      <?xml version="1.0" encoding="utf-8"?>
      <androidx.cardview.widget.CardView xmlns:android="http://schemas.android.com/apk/res/android"
          xmlns:card_view="http://schemas.android.com/apk/res-auto"
          android:id="@+id/dev_card_view"
          android:layout_width="160dp"
          android:layout_height="80dp"
          android:layout_gravity="center"
          card_view:cardCornerRadius="10dp"
          card_view:contentPadding="10dp"
          android:layout_margin="20dp">
      
          <TextView
              android:id="@+id/textView"
              android:layout_width="wrap_content"
              android:layout_height="wrap_content"
              android:layout_gravity="center"/>
      </androidx.cardview.widget.CardView>
      

      我可以通过将 cardElevation 设置为 0dp 来摆脱过度绘制

      card_view:cardElevation="0dp"
      

      【讨论】:

        猜你喜欢
        • 2020-08-23
        • 1970-01-01
        • 2017-05-30
        • 2020-07-04
        • 1970-01-01
        • 2018-12-20
        • 1970-01-01
        • 2017-06-18
        • 1970-01-01
        相关资源
        最近更新 更多