Как очистить Canvas (после рисования увеличивающихся кругов) в TextureView

Я пытаюсь рисовать увеличивающиеся круги в 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
            }

Был бы очень признателен, если бы кто-нибудь мог мне помочь здесь. Я не мог продолжить свой проект в течение нескольких недель из-за этой проблемы.


person REG1    schedule 05.12.2014    source источник


Ответы (1)


Создайте новый экземпляр Paint, чтобы просто очистить холст.

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

В вашем блоке if() для очистки холста нарисуйте его с помощью приведенного выше экземпляра Paint.

if(clear){
    canvas.drawPaint(clearPaint);
    clear = false;
}
person Shadab Mirza    schedule 05.12.2014
comment
Я попробовал ваше предложение, но после первого цикла вся анимация все еще сходит с ума, то есть несколько кругов рисуются одновременно (как бы снова появляются), а поверх этого другие рисуются без структуры :( все равно спасибо, я открыт для любых новых идеи - person REG1; 05.12.2014
comment
Это потому, что круги рисуются друг над другом. Выложу пример кода. - person Shadab Mirza; 09.12.2014
comment
Спасибо за ответ. Я готовлюсь к экзаменам, поэтому в последнее время у меня мало времени. Вы хотите опубликовать пример кода, как рисовать круги? Если это так, это было бы очень полезно, так как я не вижу, что делаю неправильно (для меня они не рисуются друг над другом). Спасибо еще раз - person REG1; 11.12.2014