圆形 shimmerDrawable(facebook android-shimmer)

Rounded shimmerDrawable (facebook android-shimmer)

所以,我有来自 https://github.com/facebook/shimmer-android

的可绘制对象
val shimmer = ColorHighlightBuilder()
            .setBaseColor(ContextCompat.getColor(context, R.color.skeleton_mask))
            .setBaseAlpha(SHIMMERING_BASE_ALPHA)
            .setHighlightAlpha(SHIMMERING_HIGHLIGHT_ALPHA)
            .setHighlightColor(ContextCompat.getColor(context, R.color.skeleton_shimmer))
            .setDuration(SHIMMERING_DURATION)
            .setDirection(Shimmer.Direction.LEFT_TO_RIGHT)
            .setAutoStart(true)
            .build()

val shimmerDrawable = ShimmerDrawable()
shimmerDrawable.setShimmer(shimmer)

问题:这个 drawable 的形状是 Rect,正在闪烁。

但我希望它是带圆角的矩形。除了贡献库和修改 ShimmerDrawable 之外,是否有任何解决方案?也许一些包装到另一个可绘制对象中,idk

这个库有关于圆角的问题https://github.com/facebook/shimmer-android/issues/84但唯一可用的解决方案是用 CardView 包装持有这个可绘制对象的视图,我不想要这个

看看ShimmerDrawable.java的源代码,实现你想要的东西并不难。有几处需要稍微更改一下。

// private final Rect mDrawRect = new Rect();
private final RectF mDrawRect = new RectF();

...

// canvas.drawRect(mDrawRect, mShimmerPaint);
canvas.drawRoundRect(mDrawRect, 50f, 50f, mShimmerPaint);

就是这样。但是为了您自己的方便,您可能希望对其进行更多修改。如果是,请忽略上面的代码,按照下面的代码进行操作。

// private final Rect mDrawRect = new Rect();
private final RectF mDrawRect = new RectF();

private final float xRadius;
private final float yRadius;

public ShimmerDrawable(final float xRadius, final float yRadius) {
    mShimmerPaint.setAntiAlias(true);
    this.xRadius = xRadius;
    this.yRadius = yRadius;
}

...

// canvas.drawRect(mDrawRect, mShimmerPaint);
canvas.drawRoundRect(mDrawRect, xRadius, yRadius, mShimmerPaint);

稍后,您可以创建一个 ShimmerDrawable

  • 科特林
val shimmerDrawable = ShimmerDrawable(50f, 50f)
  • Java
ShimmerDrawable shimmerDrawable = new ShimmerDrawable(50f, 50f);

为了在不同的屏幕密度下可移植,您可能还想在创建 ShimmerDrawable.

之前转换 xRadiusyRadius 的值
private final int dpToPx(final Context context,final float dp)
{
    return (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, dp, context.getResources().getDisplayMetrics());
}