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

Просмотреть onDraw (Canvas c) в сравнении с draw (Canvas c) в android?

Я новичок в разработке Android, я изучаю View. Я сталкиваюсь с известными двумя методами onDraw(Canvas c) и draw(Canvas c).

Не могли бы вы объяснить мне разницу и использование этих двух методов? Какой метод даст лучшую производительность (FPS) при обновлении холста с изображениями?

4b9b3361

Ответ 1

Есть разница между ними

  • onDraw (Canvas c) - это метод переопределения и автоматически вызывается, когда вид оказаны. Здесь вы можете сделать свой дополнительный рисунок, например, сделать круги, линии или что угодно.

  • draw (Canvas c) используется для ручного отображения этого представления (и все его дети) к данному холсту. Представление должно было выполнить полный макет перед вызовом этой функции. При реализации представления реализуйте onDraw(android.graphics.Canvas) вместо переопределения этого метода. Если вам нужно переопределить этот метод, вызовите версию суперкласса.

Или простыми словами draw (Canvas c) - это просто функция, которая не вызывается автоматически при визуализации представления. Пользователь должен предоставить холст, на котором будет отображаться это представление, и пользователю также необходимо выполнить весь рисунок на холсте перед вызовом этой функции.

Ответ 2

Просто, если кто-то все еще ищет ответ, как я, и не нашел его.

Метод draw() вызывается каркасом, когда представление необходимо перерисовать, а метод draw() вызывает onDraw() для рисования содержимого представления.

void draw(Canvas canvas)
{
     ..... do default stuff (background, layers)
     onDraw(canvas)
     ..... do other stuff ( scroll bars, fading edges, children)

}

Ответ 3

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

  • Не переопределяйте draw(Canvas) при реализации пользовательского View, предназначенного для использования внутри макета.
  • Если ваше пользовательское представление предназначено для использования в качестве полноэкранного режима, то переопределение draw() сохранит вам некоторые ненужные вызовы в каждом цикле.

Более длинный ответ

  • В своем круге рисования фреймворк использует draw(Canvas). Это то, что я могу найти в коде View:
    • Шаг 1: при необходимости нарисуйте фон
    • Шаг 2: сохранение слоев холста
    • Шаг 3: нарисуйте содержимое --- onDraw() появится здесь
    • Шаг 4: нарисуйте детей
    • Шаг 5: нарисуйте эффект затухания и восстановите слои.
    • Шаг 6: нарисуйте полосы прокрутки

Полезный совет

  • Вы можете визуализировать любой вид в выпадающем растровом файле, который вы создаете, а затем использовать это растровое изображение где угодно:

    Canvas c = new Canvas();
    c.setBitmap(myOffscreenBitmap);
    myView.draw(c);
    
    • для простых случаев (когда это не ViewGroup и полосы прокрутки не нужны), простой onDraw(Canvas) мог бы также сделать трюк.