我想做一些非常简单的事情(见上文).我希望画布的所有像素都是纯色,但填充中心圆的像素除外.我已经阅读了关于这个主题的数百个堆栈溢出帖子,并尝试了数百种事情,包括设置PorterDuff.Mode.这是我当前onDraw()的MyView扩展视图:
protected void onDraw(Canvas canvas) { int w = canvas.getWidth(); int h = canvas.getHeight(); Paint framePaint = new Paint(); framePaint.setStyle(Paint.Style.FILL); framePaint.setColor(Color.BLUE); canvas.drawRect(0, 0, w, h, framePaint); Paint transparentPaint = new Paint(); transparentPaint.setColor(Color.TRANSPARENT); transparentPaint.setAntiAlias(true); canvas.drawCircle(w / 2, h / 2, (w + h) / 4, transparentPaint); }
我误解了什么,为什么我不能用透明涂料涂在现有的像素上.当我这样做时,像素保持不变.当我使用PorterDuff时,像素变黑.请帮忙.
试试这个:
public class TransparentCircle extends View { Bitmap bm; Canvas cv; Paint eraser; public TransparentCircle(Context context) { super(context); Init(); } public TransparentCircle(Context context, AttributeSet attrs) { super(context, attrs); Init(); } public TransparentCircle(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); Init(); } private void Init(){ eraser = new Paint(); eraser.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.CLEAR)); eraser.setAntiAlias(true); } @Override protected void onSizeChanged(int w, int h, int oldw, int oldh) { if (w != oldw || h != oldh) { bm = Bitmap.createBitmap(w, h, Bitmap.Config.ARGB_8888); cv = new Canvas(bm); } super.onSizeChanged(w, h, oldw, oldh); } @Override protected void onDraw(Canvas canvas) { int w = getWidth(); int h = getHeight(); int radius = w > h ? h / 2 : w / 2; bm.eraseColor(Color.TRANSPARENT); cv.drawColor(Color.BLUE); cv.drawCircle(w / 2, h / 2, radius, eraser); canvas.drawBitmap(bm, 0, 0, null); super.onDraw(canvas); } }