圆形 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
.
之前转换 xRadius
和 yRadius
的值
private final int dpToPx(final Context context,final float dp)
{
return (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, dp, context.getResources().getDisplayMetrics());
}
所以,我有来自 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
.
xRadius
和 yRadius
的值
private final int dpToPx(final Context context,final float dp)
{
return (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, dp, context.getResources().getDisplayMetrics());
}