Android-анимация — исходное состояние просмотра

У меня есть Animation, в результате которого вид выскальзывает из экрана вправо, это работает, как и ожидалось, со следующим кодом:

Animation outtoRight = new TranslateAnimation(
         Animation.RELATIVE_TO_SELF,  0.0f, Animation.RELATIVE_TO_SELF,  +1.0f,
         Animation.RELATIVE_TO_SELF,  0.0f, Animation.RELATIVE_TO_SELF,   0.0f
        );
outtoRight.setDuration(500);
outtoRight.setInterpolator(new AccelerateInterpolator());
outtoRight.setFillAfter(true);

Это означает, что вид, к которому я применяю эту анимацию, будет красиво скользить за пределы экрана. У меня есть противоположное для скольжения, конечно. Но мой вопрос в том, как я могу вывести вид из экрана, чтобы я мог вставить его, не применяя к нему эту анимацию хотя бы один раз?

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

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


person Juan Cortés    schedule 24.05.2012    source источник


Ответы (5)


Я не специалист по анимациям, но попробую :)

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

EnterByRight.xml

 <set xmlns:android="http://schemas.android.com/apk/res/android"
     android:shareInterpolator="false">
    <translate android:fromXDelta="100%" android:toXDelta="0%"
      android:fromYDelta="0%" android:toYDelta="0%"
     android:duration="400"/>
   </set>

В моем случае я анимирую TableLayout, определенный в xml. Когда я хочу, чтобы он скользил:

Animation animationEnterByRight = AnimationUtils.loadAnimation(this, R.anim.animationentrancebyright);
tableLayout.startAnimation(animationEnterByRight);

и он исходит из-за экрана, мне не нужно сначала позиционировать его снаружи, анимация позаботится об этом за меня. Это прекрасно работает, если вы хотите анимировать свое представление сразу после его загрузки.

Если вам нужно сохранить свое представление «невидимым» в течение определенного периода времени, а затем отобразить анимацию, я не могу думать ни о каком решении, кроме View.Visible и View.Gone. Но я не понял, почему это проблема?

Ваше здоровье!

person caiocpricci2    schedule 29.05.2012

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

Затем в первый раз (я контролирую это в первый раз с помощью тега на представлении) я устанавливаю видимость на View.VISIBLE и применяю анимацию для скольжения. Это работает, как и ожидалось, без сбоев и скачков, но я все еще беспокоюсь о Последствия добавления анимации ко многим элементам одновременно связаны с производительностью.

person Juan Cortés    schedule 25.05.2012

На самом деле ваш собственный ответ совсем не плох. Единственное, что я хотел бы изменить, это не устанавливать для просмотра жизнеспособность GONE, а создавать и добавлять его вручную с помощью addChild().

Сделайте это в отдельном потоке, добавьте анимацию в отдельный поток и вызовите addChild() только в основном потоке.

Как правило, вы должны выполнять процесс инициализации в отдельных потоках, поэтому поток пользовательского интерфейса не будет затронут, и если он занимает более 0,4 секунды, вы должны запустить анимацию загрузки минимум на 0,5 секунды. Это лучшая практика пользовательского интерфейса, которую я могу вам сказать, я сделал это в своем приложении, и это отлично работает!

person Ilya Gazman    schedule 29.05.2012

Можешь попробовать outtoRight.setFillBefore(false); ?

person theelfismike    schedule 25.05.2012
comment
Попробовал, дело в том, что мне понадобилась бы третья анимация, чтобы просто поместить ее за пределы экрана для начала, это кажется немного странным. - person Juan Cortés; 25.05.2012

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

yourview.getViewTreeObserver().addOnPreDrawListener(new ViewTreeObserver.OnPreDrawListener() {
    @Override
        public boolean onPreDraw() {
            yourview.getViewTreeObserver().removeOnPreDrawListener(this);
            yourview.setTranslationX(something that will take it out of the screen, depends on padding);
            yourview.runIntroAnimation();
            return false;
       }
};
person itayrabin    schedule 05.03.2015