Bezdepbonusu7Программирование: статьи и ответы

Вопрос

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

Автор вопроса: REG1Ответов: 1

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

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

androidjavaandroid-canvasgraphics

Ответы

Ответ 1 · рейтинг 2 · Shadab Mirza

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

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

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

if(clear){
    canvas.drawPaint(clearPaint);
    clear = false;
}

Перевод вопроса и ответов сообщества Stack Overflow, лицензия CC BY-SA. Оригинал на Stack Overflow.

Похожие материалы