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

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

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

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

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

Я читал некоторые похожие вопросы по сети, но Я не нашел объяснения, которое понял бы.

спасибо

6 ответов


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

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

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

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's 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 () пуст. Его для вас реализовать.


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


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

я справляюсь с этим так:

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 () таким образом, не получая ошибки...

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


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


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

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


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

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