Android пользовательский зум анимация плохая производительность - PullRequest
4 голосов
/ 19 октября 2011

У меня немного специфическая проблема, но, надеюсь, кто-то вмешается и поможет.

Я написал собственную анимацию масштабирования (публикуя runnables, которые изменяют целевой вид на обработчик в течение определенного промежутка времени), но когда я изменяю ширину и высоту вида, это как если бы я выполнил масштабирование вокруг (0 , 0) вида, тогда как я хочу увеличить его центр, поэтому я перемещаю вид, изменяя его поля соответственно. Дело в том, что когда шаг итерации масштабирования слишком мал (т. Е. 0,01f и менее), я должен изменить поля вида примерно на 1 пиксель, иногда только в одном из направлений, что делает его похожим на анимацию , Я не уверен в точной причине, но я попробовал следующие вещи:

1) Я попытался изменить поля, переопределив onLayout () моего родительского представления, которое будет вызываться при настройке layoutParams при масштабировании (я сделал это, чтобы избежать повторного вызова setLayoutParams () при перемещении, которое сейчас фактически не выполняется). не кажется вполне разумным, поскольку setLayoutParams () просто устанавливает некоторый флаг, который будет использоваться позже).

2) Я проверяю новые поля, чтобы установить их, чтобы они устанавливались только тогда, когда есть разница между новым и старым полями в направлениях X и Y.

3) Я пытался использовать view.offsetLeftAndRight () view.offsetTopAndBottom () вместо изменения параметров макета для перемещения представления, но это снова оказалось безрезультатно.

Есть предложения, что поможет?

1 Ответ

1 голос
/ 23 февраля 2012

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

Вы можете сделать это в следующих шагах:

  1. получить кеш представления - через View.getDrawingCache или вызвав функцию View.draw
  2. скрыть вид
  3. получить текущее системное время - SystemClock.elapsedRealtime (благодаря этому вы можете рассчитать прогресс анимации)
  4. начать публиковать runnables, чтобы сделать ваш экран недействительным и проверить, завершена ли анимация
  5. Показать представление

Возможно, это можно сделать с помощью класса Android Animation, но я им не пользуюсь, поскольку он довольно ограничен.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...