ImageView in circular through xml

前端 未结 27 1476
死守一世寂寞
死守一世寂寞 2020-11-22 10:35

I\'d Like to make any image from my ImageView to be circular with a border.

I searched but couldn\'t find any useful information (anything that I tried

27条回答
  •  天命终不由人
    2020-11-22 10:51

    Try this.

    public class RoundedImageView extends android.support.v7.widget.AppCompatImageView {
    
        private int borderWidth = 4;
        private int viewWidth;
        private int viewHeight;
        private Bitmap image;
        private Paint paint;
        private Paint paintBorder;
        private BitmapShader shader;
    
        public RoundedImageView(Context context)
        {
            super(context);
            setup();
        }
    
        public RoundedImageView(Context context, AttributeSet attrs)
        {
            super(context, attrs);
            setup();
        }
    
        public RoundedImageView(Context context, AttributeSet attrs, int defStyle)
        {
            super(context, attrs, defStyle);
            setup();
        }
    
        private void setup()
        {
            paint = new Paint();
            paint.setAntiAlias(true);
    
            paintBorder = new Paint();
            setBorderColor(Color.WHITE);
            paintBorder.setAntiAlias(true);
            this.setLayerType(LAYER_TYPE_SOFTWARE, paintBorder);
    
            paintBorder.setShadowLayer(4.0f, 0.0f, 2.0f, Color.WHITE);
        }
    
        public void setBorderWidth(int borderWidth)
        {
            this.borderWidth = borderWidth;
            this.invalidate();
        }
    
        public void setBorderColor(int borderColor)
        {
            if (paintBorder != null)
                paintBorder.setColor(borderColor);
    
            this.invalidate();
        }
    
        private void loadBitmap()
        {
            BitmapDrawable bitmapDrawable = (BitmapDrawable) this.getDrawable();
    
            if (bitmapDrawable != null)
                image = bitmapDrawable.getBitmap();
        }
    
        @SuppressLint("DrawAllocation")
        @Override
        public void onDraw(Canvas canvas)
        {
            loadBitmap();
    
            if (image != null)
            {
                shader = new BitmapShader(Bitmap.createScaledBitmap(image, canvas.getWidth(), canvas.getHeight(), false), Shader.TileMode.CLAMP, Shader.TileMode.CLAMP);
                paint.setShader(shader);
                int circleCenter = viewWidth / 2;
                canvas.drawCircle(circleCenter + borderWidth, circleCenter + borderWidth, circleCenter + borderWidth - 4.0f, paintBorder);
                canvas.drawCircle(circleCenter + borderWidth, circleCenter + borderWidth, circleCenter - 4.0f, paint);
            }
        }
    
        @Override
        protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec)
        {
            int width = measureWidth(widthMeasureSpec);
            int height = measureHeight(heightMeasureSpec, widthMeasureSpec);
    
            viewWidth = width - (borderWidth * 2);
            viewHeight = height - (borderWidth * 2);
    
            setMeasuredDimension(width, height);
        }
    
        private int measureWidth(int measureSpec)
        {
            int result = 0;
            int specMode = MeasureSpec.getMode(measureSpec);
            int specSize = MeasureSpec.getSize(measureSpec);
    
            if (specMode == MeasureSpec.EXACTLY)
            {
                result = specSize;
            }
            else
            {
                // Measure the text
                result = viewWidth;
            }
    
            return result;
        }
    
        private int measureHeight(int measureSpecHeight, int measureSpecWidth)
        {
            int result = 0;
            int specMode = MeasureSpec.getMode(measureSpecHeight);
            int specSize = MeasureSpec.getSize(measureSpecHeight);
    
            if (specMode == MeasureSpec.EXACTLY)
            {
                result = specSize;
            }
            else
            {
                result = viewHeight;
            }
    
            return (result + 2);
         }
     }
    

    and use this ImageView in layout like:

    
    

提交回复
热议问题