我想只在卡片顶部转角.
我使用下面的属性,它正在四处转弯.
我想显示所有卡片的重叠
card_view:cardCornerRadius="4dp"
这是我的布局
Swathi.. 44
我们可以将卡片视图的marginBottom设置为负值.Margin应该与卡片半径相同.例如,
它对我有用.但我怀疑这是否是正确的做法.欢迎提出任何建议.
我们可以将卡片视图的marginBottom设置为负值.Margin应该与卡片半径相同.例如,
它对我有用.但我怀疑这是否是正确的做法.欢迎提出任何建议.
我一直在尝试相同的方法,但是没有提供的解决方案对我有用。
唯一有效的是:
1)制作一个带有圆角的自定义背景资源(如矩形)。
2)使用命令设置此自定义背景-
cardView = view.findViewById(R.id.card_view2); cardView.setBackgroundResource(R.drawable.card_view_bg);
为我完美地工作!希望这对您有所帮助。
我使用左上角和右下角半径进行的XML布局。
在您的情况下,您只需要更改topLeftRadius和topRightRadius。
棘手的事情是因为您无法让CardView做到这一点。在内部,它使用RoundRectDrawable
(私有包)的用法roundRect
如下:
// rectf, rx, ry, paint canvas.drawRoundRect(mBoundsF, mRadius, mRadius, paint);
因此,您需要一个不同的解决方案,例如,我发现Ahmed-Abdelmeged的要点是,他们在每个角落使用画布剪辑,并使用一条路径描述轮廓。
因此,尽管我不是编写此代码的人,但我会将其发布在这里,以供将来的旅行者使用。
和
package com.abdelmeged.ahmed.roundedlayout; /** * Created by ahmed on 9/17/2017. */ import android.content.Context; import android.content.res.TypedArray; import android.graphics.Canvas; import android.graphics.Path; import android.graphics.RectF; import android.graphics.Region; import android.support.annotation.NonNull; import android.support.annotation.Nullable; import android.util.AttributeSet; import android.view.View; import android.widget.FrameLayout; /** * Custom wrapper view to get round corner round view */ public class RoundedView extends FrameLayout { /** * The corners than can be changed */ private float topLeftCornerRadius; private float topRightCornerRadius; private float bottomLeftCornerRadius; private float bottomRightCornerRadius; public RoundedView(@NonNull Context context) { super(context); init(context, null, 0); } public RoundedView(@NonNull Context context, @Nullable AttributeSet attrs) { super(context, attrs); init(context, attrs, 0); } public RoundedView(@NonNull Context context, @Nullable AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); init(context, attrs, defStyleAttr); } private void init(Context context, AttributeSet attrs, int defStyle) { TypedArray typedArray = context.obtainStyledAttributes(attrs, R.styleable.RoundedView, 0, 0); //get the default value form the attrs topLeftCornerRadius = typedArray.getDimension(R.styleable. RoundedView_topLeftCornerRadius, 0); topRightCornerRadius = typedArray.getDimension(R.styleable. RoundedView_topRightCornerRadius, 0); bottomLeftCornerRadius = typedArray.getDimension(R.styleable. RoundedView_bottomLeftCornerRadius, 0); bottomRightCornerRadius = typedArray.getDimension(R.styleable. RoundedView_bottomRightCornerRadius, 0); typedArray.recycle(); setLayerType(View.LAYER_TYPE_SOFTWARE, null); } @Override protected void dispatchDraw(Canvas canvas) { int count = canvas.save(); final Path path = new Path(); float[] cornerDimensions = { topLeftCornerRadius, topLeftCornerRadius, topRightCornerRadius, topRightCornerRadius, bottomRightCornerRadius, bottomRightCornerRadius, bottomLeftCornerRadius, bottomLeftCornerRadius}; path.addRoundRect(new RectF(0, 0, canvas.getWidth(), canvas.getHeight()) , cornerDimensions, Path.Direction.CW); canvas.clipPath(path); super.dispatchDraw(canvas); canvas.restoreToCount(count); } public void setTopLeftCornerRadius(float topLeftCornerRadius) { this.topLeftCornerRadius = topLeftCornerRadius; invalidate(); } public void setTopRightCornerRadius(float topRightCornerRadius) { this.topRightCornerRadius = topRightCornerRadius; invalidate(); } public void setBottomLeftCornerRadius(float bottomLeftCornerRadius) { this.bottomLeftCornerRadius = bottomLeftCornerRadius; invalidate(); } public void setBottomRightCornerRadius(float bottomRightCornerRadius) { this.bottomRightCornerRadius = bottomRightCornerRadius; invalidate(); } }
这样一来,您就可以在渲染图像和视图之前裁剪图像和视图的边缘,因此可以完全满足您的需求。