gpt4 book ai didi

android - RatingBar 自定义 Vector Drawables 叠加

转载 作者:IT老高 更新时间:2023-10-28 23:00:59 32 4
gpt4 key购买 nike

Android 中的 RatingBar 令人沮丧。

我关注了https://stackoverflow.com/a/13107765用我自己的drawable实现一个自定义评分栏,但是所有的星星只是相互叠加,所以最终只显示一个星星。

我一辈子都想不通为什么。

编辑:PNG 可绘制对象似乎工作正常,但是用作矢量可绘制对象的 SVG 会导致此问题

最佳答案

这是一个临时修复,直到他们在支持库中查看它(我也把它放在 gist https://gist.github.com/harrane/815e8a94d7ca75d964714228af69c60c 中)

public class RatingBarVectorFix extends RatingBar {

private Bitmap mSampleTile;

public RatingBarVectorFix(Context context) {
this(context, null);
}

public RatingBarVectorFix(Context context, AttributeSet attrs) {
this(context, attrs, android.support.v7.appcompat.R.attr.ratingBarStyle);
}

public RatingBarVectorFix(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
init();
}

private void init() {
LayerDrawable drawable = (LayerDrawable) tileify(getProgressDrawable(), false);
drawable.findDrawableByLayerId(android.R.id.background).setColorFilter(backgroundTintColor, PorterDuff.Mode.SRC_ATOP);
drawable.findDrawableByLayerId(android.R.id.progress).setColorFilter(progressTintColor, PorterDuff.Mode.SRC_ATOP);
setProgressDrawable(drawable);
}

/**
* Converts a drawable to a tiled version of itself. It will recursively
* traverse layer and state list drawables.
*/
private Drawable tileify(Drawable drawable, boolean clip) {
if (drawable instanceof DrawableWrapper) {
Drawable inner = ((DrawableWrapper) drawable).getWrappedDrawable();
if (inner != null) {
inner = tileify(inner, clip);
((DrawableWrapper) drawable).setWrappedDrawable(inner);
}
} else if (drawable instanceof LayerDrawable) {
LayerDrawable background = (LayerDrawable) drawable;
final int N = background.getNumberOfLayers();
Drawable[] outDrawables = new Drawable[N];

for (int i = 0; i < N; i++) {
int id = background.getId(i);
outDrawables[i] = tileify(background.getDrawable(i),
(id == android.R.id.progress || id == android.R.id.secondaryProgress));
}
LayerDrawable newBg = new LayerDrawable(outDrawables);

for (int i = 0; i < N; i++) {
newBg.setId(i, background.getId(i));
}

return newBg;

} else if (drawable instanceof BitmapDrawable) {
final BitmapDrawable bitmapDrawable = (BitmapDrawable) drawable;
final Bitmap tileBitmap = bitmapDrawable.getBitmap();
if (mSampleTile == null) {
mSampleTile = tileBitmap;
}

final ShapeDrawable shapeDrawable = new ShapeDrawable(getDrawableShape());
final BitmapShader bitmapShader = new BitmapShader(tileBitmap,
Shader.TileMode.REPEAT, Shader.TileMode.CLAMP);
shapeDrawable.getPaint().setShader(bitmapShader);
shapeDrawable.getPaint().setColorFilter(bitmapDrawable.getPaint().getColorFilter());
return (clip) ? new ClipDrawable(shapeDrawable, Gravity.LEFT,
ClipDrawable.HORIZONTAL) : shapeDrawable;
} else {
return tileify(getBitmapDrawableFromVectorDrawable(drawable), clip);
}

return drawable;
}

private BitmapDrawable getBitmapDrawableFromVectorDrawable(Drawable drawable) {
Bitmap bitmap = Bitmap.createBitmap(drawable.getIntrinsicWidth(), drawable.getIntrinsicHeight(), Bitmap.Config.ARGB_8888);
Canvas canvas = new Canvas(bitmap);
drawable.setBounds(0, 0, canvas.getWidth(), canvas.getHeight());
drawable.draw(canvas);
return new BitmapDrawable(getResources(), bitmap);
}

@Override
protected synchronized void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
if (mSampleTile != null) {
final int width = mSampleTile.getWidth() * getNumStars();
setMeasuredDimension(ViewCompat.resolveSizeAndState(width, widthMeasureSpec, 0),
getMeasuredHeight());
}
}

private Shape getDrawableShape() {
final float[] roundedCorners = new float[]{5, 5, 5, 5, 5, 5, 5, 5};
return new RoundRectShape(roundedCorners, null, null);
}
}

关于android - RatingBar 自定义 Vector Drawables 叠加,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34001823/

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