Подтвердить что ты не робот

Переопределить onDraw() или draw()?

Мой проект основан на surfaceView, и до сих пор у меня был весь мой рендеринг в onDraw, который я переопределяю. Кажется, все в порядке.

Однако, я только что обновил свой SDK, и теперь он дает мне сообщение об ошибке:

Подозрительный вызов метода; вероятно, следует называть "draw", а не "onDraw"

Может кто-нибудь объяснить разницу между этими двумя?

Я прочитал несколько подобных вопросов по сети, но я не нашел объяснений, которые я понимаю.

Спасибо

4b9b3361

Ответ 1

SurfaceView.draw() в основном вызывает View.draw( ); Если вы хотите реализовать свой рисунок, вы должны сделать это в View.onDraw(), который вам нужно реализовать который даже говорит в комментариях исходного кода.

Этот метод вызывается ViewGroup.drawChild() для отображения каждого дочернего элемента нарисуйте себя. Этот метод draw() является деталью реализации и не является предназначенные для переопределения или для вызова из другого места другие чем ViewGroup.drawChild().

Что касается разницы между ними:
рисовать():

13416        /*
13417         * Draw traversal performs several drawing steps which must be executed
13418         * in the appropriate order:
13419         *
13420         *      1. Draw the background
13421         *      2. If necessary, save the canvas' layers to prepare for fading
13422         *      3. Draw view content
13423         *      4. Draw children
13424         *      5. If necessary, draw the fading edges and restore layers
13425         *      6. Draw decorations (scrollbars for instance)
13426         */

onDraw() пуст. Его для вас реализовать.

Ответ 2

Я пробовал очистить свой проект, и это решило проблему. Попробуйте.

Ответ 3

У меня проблема с тех пор.

Я обрабатываю это следующим образом:

1) Объявите метод следующим образом.

@SuppressLint("WrongCall")
public void drawTheView() {
    theCanvas = null;

    try{
        theCanvas = getHolder().lockCanvas();
        if(theCanvas != null) {
            onDraw(theCanvas);
        }
    } finally {
        getHolder().unlockCanvasAndPost(theCanvas);
    }
}

2) Теперь вы можете изменить метод onDraw():

@Override
public void onDraw(Canvas canvas) {
    //Do some drawing


}

Вы можете вызвать метод drawTheView() везде, где хотите, и вызвать метод onDraw() таким образом, не получив ошибку...

Я думаю, что это практический путь.

Ответ 4

Обратите внимание, что в случае рисования переопределение draw() и вызов super.draw часто используются, когда ViewGroup хочет нарисовать контент по его дочерним представлениям. Содержимое, нарисованное в onDraw, появится под дочерними элементами.

Ответ 5

Как сказал friiky, @SuppressLint("WrongCall") исправил мою проблему. Однако это должно быть перед именем метода, а не выше.

Что я наделал, наведите мышку на код ошибки, щелкните правой кнопкой мыши и выберите Add @SuppressLint("WrongCall")

Ответ 6

onDraw дает холст для рисования на экране.

draw() позволяет вручную нарисовать холст на экране (вы должны сами сделать холст).