RatingBar custom Vector Drawables superimposing

后端 未结 1 889
情深已故
情深已故 2020-12-30 23:34

RatingBar in android is frustrating.

I\'ve followed https://stackoverflow.com/a/13107765 to implement a custom ratingbar with my own drawables, but all the stars jus

相关标签:
1条回答
  • 2020-12-31 00:15

    Here is a temp fix until they look into it in the support lib ( I've also put it in 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);
        }
    }
    
    0 讨论(0)
提交回复
热议问题