Android - Как одновременно и последовательно анимировать несколько представлений?

Допустим, у меня есть виды A, B, C и D.

Мне нужно оживить View A, доведя его высоту от нуля до CONSTANT_HEIGHT (который у меня есть), а также его альфа от нуля до 1.

Сразу после анимации View A мне нужно оживить альфа View B от 0 до 1, альфа View C от 0 до 1 и вызвать метод setChecked на View D (настраиваемый флажок). setChecked(checked: Boolean, animate: Boolean) метод уже имеет анимацию, если параметр animate равен true.

Итак, первая анимация будет выглядеть так: View A -> от alpha до 1.0f вместе с height до CONSTANT_HEIGHT.

Сразу после завершения первой анимации начнется вторая анимация, и это будет: View B и View C alpha до 1.0f и View D вызывают setChecked(checked: true, animate:true), все они воспроизводятся вместе / одновременно (параллельно).

Как я могу этого добиться?

Я пробовал через Transition, AnimatorSet и т. Д., Но все попытки терпели неудачу. Может ли кто-нибудь посоветовать мне, как решить эту проблему?

ИЗМЕНИТЬ:

Пробуем пройти через переход:

   val tras1 = TransitionManager.beginDelayedTransition(statusLayout, Fade(Fade.IN))

   firstLine.layoutParams.height = 200
   firstLine.alpha = 1.0f
   firstCheckBox.setChecked(true, true)

Например, здесь я использовал Fade(Fade.IN) в качестве перехода, но я также меняю высоту вида (firstLine), верно? Тогда как мне запланировать следующий переход после этого? После последнего перехода нужно ли его закрыть (или что-нибудь сделать)?

РЕДАКТИРОВАТЬ2:

Я пытаюсь сделать следующее, но анимация не воспроизводится плавно (на самом деле они резко меняются, как будто анимации вообще не было. Тот же эффект, что и при вызове view.alpha = 1.0f.

TransitionManager.beginDelayedTransition(statusLayout, Fade(Fade.IN))

firstLine.alpha = 1.0f

TransitionManager.beginDelayedTransition(statusLayout, ChangeBounds())

firstLine.layoutParams.height = 200

TransitionManager.beginDelayedTransition(statusLayout, Fade(Fade.IN))

myLabel.alpha = 1.0f

person rgoncalv    schedule 07.04.2018    source источник
comment
да, Переход - это то, как вы должны следовать   -  person pskink    schedule 07.04.2018
comment
@pskink, а к какому мнению? В этом примере он дает корневую группу представлений. Означает ли это, что он не будет анимировать корневую группу представлений, а будет анимировать только любого из ее дочерних элементов, объявленных ниже beginTransition? Не могли бы вы добавить пример по моему делу?   -  person rgoncalv    schedule 07.04.2018
comment
прочитать Apply a transition without scenes раздел   -  person pskink    schedule 07.04.2018
comment
@pskink, я прочитал, как вы предложили. Посмотрите, пожалуйста, на мою правку.   -  person rgoncalv    schedule 07.04.2018
comment
так что звони другому beginDelayedTransition(), когда закончится первый Transition ... какие у тебя с ним проблемы?   -  person pskink    schedule 08.04.2018
comment
@pskink, Взгляните, пожалуйста, на Edit 2.   -  person rgoncalv    schedule 08.04.2018
comment
"so call another beginDelayedTransition() when the first Transition ends... what kind of problems do you have with it?" вызов beginDelayedTransition 3 раза подряд этого не делает   -  person pskink    schedule 08.04.2018
comment
Хм .. когда я узнаю, что первый Переход закончился? Не могли бы вы предоставить пример кода?   -  person rgoncalv    schedule 08.04.2018
comment
см. android.transition.Transition API javadocs   -  person pskink    schedule 08.04.2018
comment
@pskink, я внимательно посмотрел, и, черт возьми, я понятия не имею, извините. в iOS так просто сделать эту анимацию нескольких представлений. Почему Android так все усложняет ...   -  person rgoncalv    schedule 08.04.2018


Ответы (1)


Я столкнулся с аналогичной проблемой и нашел такой подход в Интернете:

XML-файл макета:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >

    <TextView
        android:id="@+id/text1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="1"
        android:layout_gravity="center"/>

    <TextView
        android:id="@+id/text2"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="2"
        android:layout_gravity="center"/>

    <TextView
        android:id="@+id/text3"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="3"
        android:layout_gravity="center"
        android:textSize="48sp"/>

    <TextView
        android:id="@+id/text4"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="4"
        android:layout_gravity="center"/>

    <TextView
        android:id="@+id/text5"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="5"
        android:layout_gravity="center"/>

    <TextView
        android:id="@+id/text6"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="6"
        android:layout_gravity="center"/>

</LinearLayout>

Файл Java:

@Override
protected void onCreate(Bundle savedInstanceState) {

    //your existing code here

    int[] textViewIDs = {R.id.text1, R.id.text2, R.id.text3,R.id.text4,R.id.text5,R.id.text6};
    int delayBetweenAnim = 300;

    for (int i = 0; i < textViewIDs.length; i++) {
        Animation fadeAnimation = AnimationUtils.loadAnimation(this, R.anim.fade);
        fadeAnimation.setStartOffset(i * delayBetweenAnim);
        TextView textView = (TextView) findViewById(textViewIds[i]);
        textView.startAnimation(fadeAnimation);
    }
}

Файл fade.xml

<?xml version="1.0" encoding="utf-8"?>
    <alpha xmlns:android="http://schemas.android.com/apk/res/android"
           android:interpolator="@android:anim/accelerate_decelerate_interpolator"
           android:fromAlpha="0.0" android:toAlpha="1.0"
           android:duration="500" />

ПРИМЕЧАНИЕ. Хотя это работает, я не уверен в эффективности этого кода. Я создаю только хобби-приложения для себя, и это, кажется, вполне удовлетворяет моим потребностям. Однако я бы посоветовал вам изучить еще более эффективные коды. Вероятно, эксперты могут прокомментировать недостатки этого кода ниже.

person Kathir    schedule 01.08.2018