Применить переход Slide к дочерним элементам ViewGroup - PullRequest
0 голосов
/ 17 октября 2018

Я хочу перебрать дочерние элементы LinearLayout и применить переходы Slide, чтобы они появлялись один за другим скоординированным образом.Во-первых, виды видны.Затем я звоню TransitionManager.beginDelayedTransition и применяю gone или invisible видимость для детей.Иерархия представления:

<?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 голосов
/ 17 октября 2018

Вы должны изменить 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 : публикация перехода как отложенного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);
  }
}

Smooth version Step by step version

...