Переопределить onDraw() или draw()?
Мой проект основан на surfaceView, и до сих пор у меня был весь мой рендеринг в onDraw, который я переопределяю. Кажется, все в порядке.
Однако, я только что обновил свой SDK, и теперь он дает мне сообщение об ошибке:
Подозрительный вызов метода; вероятно, следует называть "draw", а не "onDraw"
Может кто-нибудь объяснить разницу между этими двумя?
Я прочитал несколько подобных вопросов по сети, но я не нашел объяснений, которые я понимаю.
Спасибо
Ответы
Ответ 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()
позволяет вручную нарисовать холст на экране (вы должны сами сделать холст).