gpt4 book ai didi

android - 圆角ItemDecoration

转载 作者:太空宇宙 更新时间:2023-11-03 10:59:25 24 4
gpt4 key购买 nike

我有一个带有 GridLayoutManagerRecyclerView,其中包含具有各种 ViewTypes(以及 SpanSize)的项目.我需要为所有 R.layout.item_image 类型圆角,如下图所示

Round corners example

所以我创建了一个 ItemDecoration 来计算将在其上绘制这些项目的 Rect。然后将 Canvas 剪切到此 Rect(使用 Path 来圆角):

public class RoundCornersDecoration extends RecyclerView.ItemDecoration {
private final float radius;
private final RectF defaultRectToClip;

public RoundCornersDecoration(float radius) {
this.radius = radius;
defaultRectToClip = new RectF(Float.MAX_VALUE, Float.MAX_VALUE, 0, 0);
}

@Override
public void onDraw(Canvas canvas, RecyclerView parent, RecyclerView.State state) {
final RectF rectToClip = getRectToClip(parent);

// has no items with ViewType == `R.layout.item_image`
if (rectToClip.equals(defaultRectToClip)) {
return;
}

final Path path = new Path();
path.addRoundRect(rectToClip, radius, radius, Path.Direction.CW);
canvas.clipPath(path);
}

private RectF getRectToClip(RecyclerView parent) {
final RectF rectToClip = new RectF(defaultRectToClip);
final Rect childRect = new Rect();
for (int i = 0; i < parent.getChildCount(); i++) {
if (!isImage(parent, i)) {
continue;
}

final View child = parent.getChildAt(i);
parent.getDecoratedBoundsWithMargins(child, childRect);

rectToClip.left = Math.min(rectToClip.left, childRect.left);
rectToClip.top = Math.min(rectToClip.top, childRect.top);
rectToClip.right = Math.max(rectToClip.right, childRect.right);
rectToClip.bottom = Math.max(rectToClip.bottom, childRect.bottom);
}
return rectToClip;
}

private boolean isImage(RecyclerView parent, int viewPosition) {
final RecyclerView.Adapter adapter = parent.getAdapter();
final int viewType = adapter.getItemViewType(viewPosition);
return viewType == R.layout.item_image;
}
}

一切正常,除了图像下方没有绘制其他项目。我想那是因为我在实际绘制任何项目之前剪裁了 Canvas 。那么我应该如何裁剪 Canvas 以保存圆角并显示所有其他项目?

最佳答案

我终于找到了解决方案,而且非常简单。我需要做的就是提供 canvas另一部分:

pic

如您所见,topleftright 点与第一个矩形相同,因此我们只需要找到 < em>底部:

    int maxBottom = 0;
final Rect childRect = new Rect();
for (int i = 0; i < parent.getChildCount(); i++) {
final View child = parent.getChildAt(i);
parent.getDecoratedBoundsWithMargins(child, childRect);
maxBottom = Math.max(maxBottom, childRect.bottom);
}

创建一个新的矩形:

    final RectF otherItemsRect = new RectF(rectToClip);
otherItemsRect.top = otherItemsRect.bottom;
otherItemsRect.bottom = maxBottom;

将其包含到Path中,然后剪辑:

    final Path path = new Path();
path.addRoundRect(rectToClip, radius, radius, Path.Direction.CW);
path.addRect(otherItemsRect, Path.Direction.CW);
canvas.clipPath(path);

就是这样。现在我们有了所有带有图像圆角的项目

附言为了简单起见,我没有在这里提供优化的代码

关于android - 圆角ItemDecoration,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47990179/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com