将幻灯片过渡应用于 ViewGroup 的 children

Apply Slide transition to the children of a ViewGroup

我想遍历 LinearLayout 的 children 并应用幻灯片过渡,以便它们以协调的方式一个接一个地出现。首先,视图是可见的。然后我调用 TransitionManager.beginDelayedTransition 并在 children 上应用 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时,children突然消失。随着,invisible,它们以一种无序的方式消失。
我的 activity 代码是:

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);
                }
            }
        });

    }
}

您应该将 LinearLayout 中的 layout_height 更改为 "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:Post 转换为延迟的 Runnables。

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);
  }
}