【问题标题】:Custom Drawable not generating round corners for CardView's image自定义 Drawable 不为 CardView 的图像生成圆角
【发布时间】:2015-05-03 16:33:08
【问题描述】:

我用新的 CardView 和 RecyclerView 创建了一个卡片列表,看起来像这样:

我尝试修改带有圆角的卡片,正如 Mariotti 在 this 帖子中所解释的那样。

问题:问题在于,正如您从屏幕截图中看到的那样,我只能在图像保持正方形时设置卡片的角。

在示例中,扩展Drawable 的自定义Drawable 类使用Canvas.drawRoundRect() 绘制圆角矩形,并使用PaintBitmapShader 用纹理而不是简单颜色填充圆角矩形,正如here所解释的那样。

在我的适配器中,我有:

@Override
public ContactViewHolder onCreateViewHolder(final ViewGroup viewGroup, int i) {
    final View itemView = LayoutInflater
                    .from(viewGroup.getContext())
                    .inflate(R.layout.item_card_view, viewGroup, false);
    CardView cardView = (CardView) itemView.findViewById(R.id.card_view);

    ImageView imageView = (ImageView) itemView.findViewById(R.id.hImage);

    Bitmap mBitmap = BitmapFactory.decodeResource(itemView.getResources(), R.drawable.background);
    //Default
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP){
        //Default
        imageView.setBackgroundResource(R.drawable.background);
    } else {
        //RoundCorners
        madapps.hellogridview.RoundCornersDrawable round = new madapps.hellogridview.RoundCornersDrawable(
                mBitmap,            
             itemView.getResources().getDimension(R.dimen.cardview_default_radius)
                , 5); //or your custom radius

        cardView.setPreventCornerOverlap(false); //it is very important

        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN)
            imageView.setBackground(round);
        else
            imageView.setBackgroundDrawable(round);
    }

    //Set onClick listener
    cardView.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            int tag = (Integer) v.findViewById(R.id.hTitle).getTag();
            Toast.makeText(viewGroup.getContext(), "Clickable card no: "+tag, Toast.LENGTH_LONG).show();
        }
    });
    return new ContactViewHolder(itemView);
}

我已经将R.dimen.cardview_default_radius 的值覆盖为8dp,但没有结果!有什么想法吗?

【问题讨论】:

  • 我也尝试过这样做,但没有帮助。如果您删除图像或将其向下移动,您会注意到卡片有圆形边缘。所以问题出在正在使用的 ImageView 上。很难理解图像角落离开它的父母!。我没有亲自尝试过,但也许如果图像的顶角是圆形的,它可能会有所帮助。
  • 我明白你的意思。舍入图像本身也是另一种方法。然而,自定义 Drawable 类(此处:gist.github.com/gabrielemariotti/…)是为了以编程方式使图像的角变圆,此处也有说明:curious-creature.com/2012/12/11/…
  • 我也有同样的问题。你是如何解决这个问题的?
  • 检查我的最后一个答案 ;)

标签: android-layout android-imageview android-cardview cardslib


【解决方案1】:

我已经用这个解决了:

https://github.com/pungrue26/SelectableRoundedImageView

并将10dp(与卡片相同)的半径应用于图像的顶角:

<com.joooonho.SelectableRoundedImageView  android:id="@+id/headerImage"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_height="wrap_content"     
    android:layout_width="wrap_content"
    android:src="@drawable/cardbackground3"
    android:scaleType="centerCrop"
    android:adjustViewBounds="true"
    app:sriv_left_top_corner_radius="10dip"
    app:sriv_right_top_corner_radius="10dip"
    app:sriv_left_bottom_corner_radius="0dip"
    app:sriv_right_bottom_corner_radius="0dip"
    app:sriv_border_color="#333333"/>

【讨论】:

    【解决方案2】:

    谢谢,这正是我所需要的。但你知道有一个问题知道。 CardView 和 Image 的边界之间没有像填充一样的空间。但在我的情况下没有填充物。在我看来,这个库是圆角的,但不会改变图像的位置。你有同样的想法吗?顺便说一句,我的布局和你的一样。你对此有什么想法吗?

    【讨论】:

    • 那是我的错。我忘了 setPreventCornerOverlap(false) 现在正常了。
    猜你喜欢
    • 2018-03-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-16
    • 1970-01-01
    • 2011-10-07
    • 1970-01-01
    相关资源
    最近更新 更多