Draw a semicircle in the background of a View

后端 未结 4 1421
别跟我提以往
别跟我提以往 2020-12-01 03:24

I am trying to create a TextView whose background is a half circle. I create a oval using a ShapeDrawable. I tried to create a semicircle by using ScaleDrawable to double th

4条回答
  •  小蘑菇
    小蘑菇 (楼主)
    2020-12-01 03:44

    You can implement you own Drawable. But that cannot be inflated from XML. You need to set the drawable from code using View.setBackgroundDrawable();

    See my sample implementation to draw a semi circle using drawable.

    public class SemiCircleDrawable extends Drawable {
    
        private Paint paint;
        private RectF rectF;
        private int color;
        private Direction angle;
    
        public enum Direction
        {
            LEFT,
            RIGHT,
            TOP,
            BOTTOM
        }
    
        public SemiCircleDrawable() {
            this(Color.BLUE, Direction.LEFT);
        }
    
        public SemiCircleDrawable(int color, Direction angle) {
            this.color = color;
            this.angle = angle;
    
            paint = new Paint();
            paint.setColor(color);
            paint.setStyle(Style.FILL);
            paint.setAntiAlias(true);
    
            rectF = new RectF();
        }
    
        public int getColor() {
            return color;
        }
    
        /**
         * A 32bit color not a color resources.
         * @param color
         */
        public void setColor(int color) {
            this.color = color;
            paint.setColor(color);
        }
    
        @Override
        public void draw(Canvas canvas) {
            canvas.save();
    
            Rect bounds = getBounds();
    
            if(angle == Direction.LEFT || angle == Direction.RIGHT)
            {
                canvas.scale(2, 1);
                if(angle == Direction.RIGHT)
                {
                    canvas.translate(-(bounds.right / 2), 0);
                }
            }
            else
            {
                canvas.scale(1, 2);
                if(angle == Direction.BOTTOM)
                {
                    canvas.translate(0, -(bounds.bottom / 2));
                }
            }
    
    
            rectF.set(bounds);
    
            if(angle == Direction.LEFT)
                canvas.drawArc(rectF, 90, 180, true, paint);
            else if(angle == Direction.TOP)
                canvas.drawArc(rectF, -180, 180, true, paint);
            else if(angle == Direction.RIGHT)
                canvas.drawArc(rectF, 270, 180, true, paint);
            else if(angle == Direction.BOTTOM)
                canvas.drawArc(rectF, 0, 180, true, paint);
    
            canvas.restore()
        }
    
        @Override
        public void setAlpha(int alpha) {
            // Has no effect
        }
    
        @Override
        public void setColorFilter(ColorFilter cf) {
            // Has no effect
        }
    
        @Override
        public int getOpacity() {
            // Not Implemented
            return PixelFormat.UNKNOWN;
        }
    
    }
    

提交回复
热议问题