我想遍历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);
}
}
});
}
}
答案 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);
}
}