Android: как быстрее получить onDraw ()

1

Я создал операцию, которая вызывает DrawView extends View, я рисую на Canvas что-то вроде двоичного дерева. Размер холста больше размера экрана, а функция onDraw рисует все холст, а не только видимую его часть. Я добавил горизонтальный и вертикальный scrollView, и, очевидно, onDraw вызывается снова и снова, чтобы обновить представление. Мне было интересно, могу ли я рисовать холст на изображении (растровое изображение или что-то в этом роде), используя это изображение, чтобы показать дерево, не требуя вызова функции onDraw. Если я не могу этого сделать, что я могу сделать, чтобы получить более быстрый вид?

Теги:
view
canvas
bitmap
ondraw

2 ответа

1
Лучший ответ

Технически холст рисует растровое изображение. Так что это на самом деле битмап, который больше, чем экран. Почему вы делаете битмап больше экрана? Больше битмапов = больше использования памяти - что может немного замедлить работу. Вы только на самом деле рисуете в обрезанных границах экрана - вы можете подумать, что вы забираете экран, но это не так. Опираясь на другой битмап, вам это не поможет - вы уже это делаете. Не смотря на свой код, вы можете попробовать:

  • только рисуйте, какие изменения в двоичном дереве вызывают invalidate(rect) который только перерисовывает то, что изменилось
  • если бинарное дерево предназначено для статичности, просто создайте png/jpg и покажите это изображение или рисуйте все это самостоятельно
  • убедитесь, что вы не вызываете недействительность больше, чем вам нужно.
  • 0
    Мое дерево статично, так как я могу реализовать что-то вроде вашей второй точки решения? Я имею в виду, я могу экспортировать PNG / JPG, но как я могу показать его в представлении, когда пользователь прокручивает?
  • 0
    После того, как вы создадите статическое изображение png / jpg того, что вам нужно, вы должны вызвать canvas.drawBitmap (), см. Документацию. ИЛИ (в зависимости от ваших потребностей) вы можете использовать ImageView и установить изображение в этом.
Показать ещё 1 комментарий
4

Если вы используете API 11 или выше, вы можете попробовать использовать атрибут аппаратного ускорения в теге приложения в манифесте.

<application ... android:hardwareAccelerated="true" ...>

Помимо этого вы можете рассмотреть возможность использования другого рендеринга, кроме View, посмотрите также SurfaceView.

Как правило, я думаю, что вы не должны переопределять View, если вы не создаете компонент пользовательского интерфейса (например, кнопку), но не цитируйте меня на этом.

  • 0
    Я использую Android 2.3.3 (поэтому targetSdkVersion = "11"), но когда я пытаюсь использовать его, у меня возникает ошибка: "Не найден идентификатор ресурса для атрибута" hardwareAccelerated "в пакете" android ""
  • 0
    Это потому, что 2.3.3 - это уровень API 10.
Показать ещё 2 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню