Bitmap with tile mode repeat and round corners

后端 未结 2 630
無奈伤痛
無奈伤痛 2021-01-24 04:51

I have a bitmap with rounded corners method:

Code:

 public static Bitmap getRoundedCornerBitmap(Bitmap bitmap, int pixels) {
        Bitmap output = Bitm         


        
相关标签:
2条回答
  • 2021-01-24 05:30

    Try out with extend BitmapDrawable and override the paint() method to set the image in tile mode:

    In this method we avoid creating a new bitmap having the size of the view.

    class MyBitmapDrawable extends BitmapDrawable {
        private Paint mPaint = new Paint(Paint.FILTER_BITMAP_FLAG | Paint.DITHER_FLAG);
        private boolean mRebuildShader = true;
        private Matrix mMatrix = new Matrix();
    
        @Override
        public void draw(Canvas canvas) {
            Bitmap bitmap = getBitmap();
            if (bitmap == null) {
                return;
            }
    
            if (mRebuildShader) {
                mPaint.setShader(new BitmapShader(bitmap, TileMode.REPEAT, TileMode.REPEAT));
                mRebuildShader = false;
            }
    
            // Translate down by the remainder
            mMatrix.setTranslate(0, getBounds().bottom % getIntrinsicHeight());
            canvas.save();
            canvas.setMatrix(mMatrix);
            canvas.drawRect(getBounds(), mPaint);
            canvas.restore();
        }
    }
    

    It can be set to the view like this:

    view.setBackgroundDrawable(new MyBitmapDrawable(getResources().getDrawable(R.drawable.smiley).getBitmap()));
    

    Check out its reference HERE

    0 讨论(0)
  • 2021-01-24 05:41

    Finally i have solved it !!!

    class CurvedAndTiled extends Drawable {
    
        private final float mCornerRadius;
        private final RectF mRect = new RectF();
        private final BitmapShader mBitmapShader;
        private final Paint mTilePaint;        
    
        CurvedAndTiled(
                Bitmap bitmap, 
                float cornerRadius) {
            mCornerRadius = cornerRadius;
    
            mBitmapShader = new BitmapShader(bitmap,
                    Shader.TileMode.REPEAT, Shader.TileMode.REPEAT);
    
            mTilePaint = new Paint();
            mTilePaint.setAntiAlias(true);
            mTilePaint.setShader(mBitmapShader);             
        }
    
        @Override
        protected void onBoundsChange(Rect bounds) {
            super.onBoundsChange(bounds);
            mRect.set(0, 0, bounds.width(), bounds.height());
        }
    
        @Override
        public void draw(Canvas canvas) {
            canvas.drawRoundRect(mRect, mCornerRadius, mCornerRadius, mTilePaint);           
        }
    
        @Override
        public int getOpacity() {
            return PixelFormat.TRANSLUCENT;
        }
    
        @Override
        public void setAlpha(int alpha) {
            mTilePaint.setAlpha(alpha);
        }
    
        @Override
        public void setColorFilter(ColorFilter cf) {
            mTilePaint.setColorFilter(cf);
        }       
    }
    

    apply this too your image view.

    backgroundImage.setBackgroundDrawable(new CurvedAndTiled(((BitmapDrawable) drawable).getBitmap(), 45));
    

    Hope it will help someone in future.

    Happy Coding :)

    0 讨论(0)
提交回复
热议问题