将幻灯片过渡应用于ViewGroup的子级

时间:2018-10-17 06:11:08

标签: android android-animation android-transitions

我想遍历LinearLayout的子项并应用Slide过渡,以便它们以协调的方式一个接一个地出现。首先,视图是可见的。然后,我打电话给TransitionManager.beginDelayedTransition,并对孩子施加goneinvisible的可见性。视图层次结构:

<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">

    <Button
        android:id="@+id/start"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginStart="8dp"
        android:layout_marginTop="8dp"
        android:layout_marginEnd="8dp"
        android:text="Button"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintBottom_toBottomOf="parent" />
    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:id="@+id/container"
        android:orientation="vertical"
        >
        <TextView android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="Bruce Lee"
            android:textAppearance="@style/TextAppearance.AppCompat.Headline"
            android:padding="@dimen/padding"
            />

        <TextView android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="Jason Statham"
            android:textAppearance="@style/TextAppearance.AppCompat.Headline"
            android:padding="@dimen/padding"

            />

        <TextView android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="Jean-Claude Van Damme"
            android:textAppearance="@style/TextAppearance.AppCompat.Headline"
            android:padding="@dimen/padding"

            />

        <TextView android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="Arnold Schwarzenegger"
            android:textAppearance="@style/TextAppearance.AppCompat.Headline"
            android:padding="@dimen/padding"

            />

        <TextView android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="Sylvester Stallone"
            android:textAppearance="@style/TextAppearance.AppCompat.Headline"
            android:padding="@dimen/padding"

            />

        <TextView android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="Scot Atkins"
            android:textAppearance="@style/TextAppearance.AppCompat.Headline"
            android:padding="@dimen/padding"

            />

        <TextView android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="Bruce Lee"
            android:textAppearance="@style/TextAppearance.AppCompat.Headline"
            android:padding="@dimen/padding"

            />


    </LinearLayout>
</android.support.constraint.ConstraintLayout>

应用gone时,孩子突然消失。通过invisible,它们以心室混沌的方式消失。
我的活动代码是:

public class MainActivity extends AppCompatActivity {

    Button mButton;
    ViewGroup mContainer;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        mContainer = findViewById(R.id.container);
        mButton = findViewById(R.id.start);
        mButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Log.d("MainActivity", "onClick: child count: " + mContainer.getChildCount());
                for(int i = 0; i < mContainer.getChildCount(); i++) {
                    Log.d("MainActivity", "onClick: transitioning child " + mContainer.getChildAt(i).toString());
                    TransitionManager.beginDelayedTransition((ViewGroup)findViewById(R.id.container), new Slide().setDuration(1000));
                    (mContainer.getChildAt(i)).setVisibility(View.GONE);
                }
            }
        });

    }
}

1 个答案:

答案 0 :(得分:1)

您应将layout_height中的LinearLayout更改为"match_parent"

<LinearLayout
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:id="@+id/container"
    android:orientation="vertical"
    >

更新:我不敢相信您想永远隐藏您的项目,而且我认为您不希望这些项目显示在底部而不是屏幕的右侧。让我建议您再修复一次Java代码:

for (int i = 0; i < mContainer.getChildCount(); i++) {
    View child = mContainer.getChildAt(i);
    TransitionManager.beginDelayedTransition(mContainer, new Slide(Gravity.END).setDuration(1000));
    child.setVisibility(child.getVisibility() == View.VISIBLE ? View.GONE : View.VISIBLE);
}

无论如何,现在您有更多选择可以玩。

UPDATE2 :作为过渡的Runnable发布过渡。

public void onClick(View view) {
  for(int i = 0; i < mContainer.getChildCount(); i++) {
    final View child = mContainer.getChildAt(i);
    final Transition slide = new Slide(Gravity.END).setDuration(1000);
    mContainer.postDelayed(new Runnable() {
      @Override
      public void run() {
        TransitionManager.beginDelayedTransition(mContainer, slide);
        child.setVisibility(child.getVisibility() == View.VISIBLE ? View.INVISIBLE : View.VISIBLE);
      }
    }, 1000 * i);
  }
}

Smooth version Step by step version