Анимация перевода Android для скрытия видов без изменения видимости

#android #android-layout #android-animation

#Android #android-макет #android-анимация

Вопрос:

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

 <RelativeLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_alignParentTop="true" >

        <LinearLayout
            android:id="@ id/oneBigView"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:layout_centerVertical="true"
            android:gravity="center_vertical"
            android:orientation="vertical">


        </LinearLayout>

        <LinearLayout
            android:id="@ id/fourSmallViews"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_centerVertical="true"
            android:gravity="center_vertical"
            android:orientation="vertical" >

            <LinearLayout
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:weightSum="2" >

                <RelativeLayout
                    android:id="@ id/topLeft"
                    android:layout_width="0dp"
                    android:layout_height="match_parent"
                    android:layout_weight="1" >                       
                </RelativeLayout>

                <RelativeLayout
                    android:id="@ id/topRight"
                    android:layout_width="0dp"
                    android:layout_height="match_parent"
                    android:layout_weight="1">
                </RelativeLayout>
            </LinearLayout>

            <LinearLayout
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:visibility="invisible"
                android:weightSum="2" >

                <RelativeLayout
                    android:id="@ id/bottomLeft"
                    android:layout_width="0dp"
                    android:layout_height="match_parent"
                    android:layout_weight="1" >


                </RelativeLayout>

                <RelativeLayout
                    android:id="@ id/bottomRight"
                    android:layout_width="0dp"
                    android:layout_height="match_parent"
                    android:layout_weight="1" >


                </RelativeLayout>
            </LinearLayout>
        </LinearLayout>
    </RelativeLayout>
  

Я хочу показать и скрыть некоторые виды:

  1. Вид не отображается
  2. TopLeft и topRight перемещаются от краев (TopLeft слева, topRight справа) к центру экрана (родительский).
  3. Когда TopLeft и topRight выполняют половину своего перемещения, bottomLeft и bottomRight отображаются точно так же, как TopLeft и topRight на предыдущем шаге
  4. Все четыре вида остаются видимыми в течение нескольких секунд.
  5. TopLeft и topRight перемещаются из центра экрана (родительского) к краям (TopLeft влево, topRight вправо).
  6. Когда TopLeft и topRight выполняют половину своего хода, bottomLeft и bottomRight перемещаются точно так же, как TopLeft и topRight на предыдущем шаге
  7. Когда все виды исчезают, oneBigView перемещается от левого края и заполняет экран.
  8. oneBigView остается на несколько секунд.
  9. oneBigView перемещается от центра к левому краю экрана.
  10. Когда oneBigView исчезает, все начинается сначала с 1.

обзор анимации

Я пытался это сделать, но всегда что-то было не так:

  1. Я попытался добавить несколько анимаций перевода и изменить видимость (я попробовал View.НЕВИДИМЫЙ и VIEW.GONE) onAnimationEnd:

показать

     <set xmlns:android="http://schemas.android.com/apk/res/android"
    android:interpolator="@android:anim/decelerate_interpolator">
    <translate 
    android:fromXDelta="-100%p" 
    android:toXDelta="0"
    android:duration="500" />
    </set>
  

скрыть

     <set xmlns:android="http://schemas.android.com/apk/res/android"
    android:interpolator="@android:anim/decelerate_interpolator">
        <translate 
        android:fromXDelta="0"
        android:toXDelta="-100%p"
        android:duration="500" />

    </set>
  

.java

 final Animation leftIn=AnimationUtils.loadAnimation(this, R.anim.show);
final Animation leftOut=AnimationUtils.loadAnimation(this, R.anim.hide);
leftIn.setAnimationListener(new Animation.AnimationListener() {

        @Override
        public void onAnimationStart(Animation animation) {
            // TODO Auto-generated method stub

            //start animation for showing topRight bottomLeft and bottomRight 
            //with propper startOffset
        }

        @Override
        public void onAnimationRepeat(Animation animation) {
            // TODO Auto-generated method stub

        }

        @Override
        public void onAnimationEnd(Animation animation) {
            // TODO Auto-generated method stub
            left1.setVisibility(View.VISIBLE);
            leftOut.setStartOffset(4000);
            left1.startAnimation(leftOut);

        }
    });
leftOut.setAnimationListener(new Animation.AnimationListener() {

        @Override
        public void onAnimationStart(Animation animation) {
            // TODO Auto-generated method stub

        }

        @Override
        public void onAnimationRepeat(Animation animation) {
            // TODO Auto-generated method stub

        }

        @Override
        public void onAnimationEnd(Animation animation) {
            // TODO Auto-generated method stub

            left1.setVisibility(View.INVISIBLE);
        }
    });
  

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

Есть идеи?

Ответ №1:

Вы можете попробовать изменить альфа-значение представлений вместо того, чтобы делать его невидимым или исчезать.

Ответ №2:

Вам следует попробовать добавить fillAfter к обоим вашим <set> таким образом:

 <set 
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:interpolator="@android:anim/decelerate_interpolator"
    android:fillAfter="true">
  

Настройка видимости с помощью View.INVISIBLE и View.VISIBLE обычно плохо работает с анимациями. Ваш единственный другой вариант — добавить альфа-анимацию к обоим <set> . Вот шаблон:

 <alpha
    android:fromAlpha="1.0"
    android:toAlpha="0.0"
    android:duration="200"
    android:interpolator="@android:anim/accelerate_interpolator"/>
  

Настройте ее в соответствии с вашими потребностями. Избегайте настройки видимости.