Переопределить 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()
позволяет вручную нарисовать холст на экране (вы должны сделать холст самостоятельно).