如何在TextureView中清除画布(绘制渐增圆圈后)

时间:2014-12-05 15:16:48

标签: java android graphics android-canvas

我正在尝试在TextureView中绘制渐增的圆圈。所有圈子的中心都是一样的。然后我尝试增加绘制的圆,直到达到特定限制。然后我想清理画布并重新开始。但是使用我的代码(见下文),画布似乎永远不会被清除。实际上它应该被清除时很快闪烁白色,但是当下一个循环中的第一个圆圈被绘制时(在尝试清除画布之后),所有先前的圆圈重新出现并且整个动画似乎变得疯狂。让它运行几秒后,我留下了几十个圆圈(有些重叠),而不是每个循环只有大约4个圆圈。此外,他们没有我给他们的半径(基本上我的代码最终绘制了无数个随机大小的圆圈)。花了好几天尝试不同的东西,但似乎没有任何帮助。

这是我的代码:

paint.setColor(Color.argb(opac, 177, 177, 177));
            stroke = 5;
            paint.setStrokeWidth(stroke);
            radius = 10;
            Canvas canvas = new Canvas();
            Boolean clear = false;
        //Added these two lines following advice from a previous answer:
        Paint clearPaint = new Paint();
        clearPaint.setXfermode(new PorterDuffXfermode(Mode.CLEAR));

        while (mRunning && !Thread.interrupted()) {

            canvas = mSurface.lockCanvas(null);
            try {   
                if(clear){
                    canvas.drawPaint(clearPaint); //This line should clear the canvas.
                    clear = false;
                }else{                      
                    canvas.drawCircle(circleX, circleY, radius, paint);
                }
            } finally {
                mSurface.unlockCanvasAndPost(canvas);
            }
            if(radius+15 <= circleY-stroke/2){
                radius+=15;
            }else{
                radius = 10;
                clear = true;
            }  
            try {
                Thread.sleep(360);
            } catch (InterruptedException e) {
                // Interrupted
            }

如果有人可以帮助我,我会非常感激。由于这个问题,我现在无法继续我的项目数周。

1 个答案:

答案 0 :(得分:2)

创建一个新的绘制实例,仅用于清除画布

Paint clearPaint = new Paint();
clearPaint.setXfermode(new PorterDuffXfermode(Mode.CLEAR));

在用于清除画布的if()块中,使用上面的Paint

实例绘制它
if(clear){
    canvas.drawPaint(clearPaint);
    clear = false;
}