Плавная анимация для тяжелых макетов

Мое приложение использует стандартный андроид TranslateAnimation для слайд-шоу в и из экрана. К сожалению, макет кажется довольно тяжелым: ImageView, куча текстовых представлений и Галерея с текстом и изображениями в нем. Существует два вида анимации: один, который открывается, и другой, который скользит.

Проблема заключается в низкой производительности этих анимаций, особенно на устройствах с менее мощным процессором. Анимация не выглядит достаточно гладко.

Я думаю об удалении TranslateAnimations и попытке захватить содержимое представления в растровом изображении и переместить их как ImageViews.

Есть ли у вас какие-либо идеи о том, как такие задачи должны выполняться должным образом, и поможет ли подход к перемещению изображений?

P.S.

Я думаю, что я могу неправильно использовать анимацию. У меня есть два взгляда на FrameLayout. Один из них виден, другой - нет. Затем я обрабатываю события касания и применяю TranslateAnimations к обоим представлениям (в ACTION_MOVE), когда пользователь перемещает палец вдоль экрана. Таким образом, похоже, что пользователь перемещает один вид из экрана, вытягивая другой со стороны экрана. Он отлично работает для облегченных макетов.

Ответ 1

Наконец, мне удалось реализовать требуемое поведение, используя настраиваемый вид галереи. Теперь он работает отлично.

Ответ 2

Вам следует включить кеш чертежа в анимированных представлениях. Посмотрите документацию для View.setDrawingCacheEnabled(boolean).

Ответ 3

Другим решением было бы сделать ваши представления на 3D-поверхности и оживить их через OpenGL. То, как Sony делает все свои отличные анимации, как видно, например, в приложении TimeScape.

Там сообщение в блоге об этом.

Ответ 4

Вы должны попробовать использовать flipper. Его очень просто включить в него свои взгляды и использовать анимационные файлы для выполнения многочисленных анимаций. Эта ссылка может быть полезна:

viewFlipper для анимации

Ответ 5

Как вы реагируете на события касания, вы, вероятно, создаете новые TranslateAnimations в вашем методе onTouch, который запускается очень часто. Массовое создание новых экземпляров приводит к массивной сборке мусора.

2 решения:

  • Внедрите свой собственный StaticTranslateAnimation и не создавайте его для каждого события перемещения (например, setTranslation (int x, int y)). Даунсайд: этот подход работал у меня только для одной анимации. Анимация двух объектов за раз приводила к сбору мусора, хотя в процессе обработки событий объекты не были созданы (в моем коде).

  • Используйте offsetLeftAndRight (int offset) и offsetTopAndBottom (int offset) вместо анимаций, которые намного лучше работают на старых и Android 2.x устройствах и полностью избегают сбора мусора.