转换管理器 - 滑动视图未按预期工作

4

enter image description here

我正在尝试使用Transition + Transition Manager来滑动显示和隐藏视图,但是当点击隐藏按钮使视图变为GONE时,它没有滑动动画。然而,显示按钮确实有滑入动画,使视图再次VISIBLE

    @OnClick(R.id.testBtn)
        public void onTestBtnClick(){
            //hide
            Transition transition = new Slide(Gravity.START);
            transition.setDuration(600);

            TransitionManager.beginDelayedTransition(mParentLayout, transition);
            mLayout.setVisibility(View.GONE);
        }

        @OnClick(R.id.testBtn2)
        public void onTestBtn2Click(){
            //show
            Transition transition = new Slide(Gravity.START);
            transition.setDuration(600);

            TransitionManager.beginDelayedTransition(mParentLayout, transition);
            mLayout.setVisibility(View.VISIBLE);
        }

我尝试将testBtn2的重力改为Gravity.END,但这会导致它从屏幕右侧开始滑动。

这是布局:

<androidx.constraintlayout.widget.ConstraintLayout
    android:id="@+id/main_activity_root_view"
    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"
    android:orientation="vertical"
    tools:context=".MainActivity">

    <Button
        android:id="@+id/testBtn"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        app:layout_constraintTop_toTopOf="parent"
        android:text="Hide"
        app:layout_constraintStart_toStartOf="parent"/>

    <Button
        android:id="@+id/testBtn2"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        app:layout_constraintTop_toTopOf="parent"
        app:layout_constraintStart_toEndOf="@id/testBtn"
        android:text="show"
        />

    <LinearLayout
        android:id="@+id/layout"
        android:orientation="vertical"
        android:layout_width="100dp"
        android:layout_height="250dp"
        android:background="@drawable/background_side_bar_corners"
        app:layout_constraintTop_toTopOf="parent"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintStart_toStartOf="parent"/>
</androidx.constraintlayout.widget.ConstraintLayout>
4个回答

2

不确定你的代码出了什么问题。我创建了一个示例,尝试下面的代码,它可以正常工作。确保在布局中为面板视图添加 android:visibility="gone",这样它在首次启动时就会被隐藏。

public class MainActivity extends AppCompatActivity {
boolean isShowing = false;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_damm_activty);
    findViewById(R.id.testBtn).setOnClickListener(v -> {
        showSlidingPanel(!isShowing);
    });
}

private void showSlidingPanel(boolean show) {
    ViewGroup parent = findViewById(R.id.main_activity_root_view);
    View layout = findViewById(R.id.layout);
    Transition transition = new Slide(Gravity.START);
    transition.setDuration(450);
    transition.addTarget(R.id.layout);
    transition.setInterpolator(new AccelerateDecelerateInterpolator());
    TransitionManager.beginDelayedTransition(parent, transition);
    layout.setVisibility(show ? View.VISIBLE : View.GONE);
    isShowing = show;
}
}

1
滑入动画可以正常工作,但是如何让它滑出呢? - DIRTY DAVE
这是你预期得到的吗?https://streamable.com/0j3wvj 这是我得到的。 - DIRTY DAVE
只是为了明确,我正在使用TransitionManager和其他类的Android x版本。 - ADM
2
在我的真实设备Pixel 4a API 30上测试过,也无法运行。另外...我刚刚测试了上面的代码,在Nexus 5X上可以运行... - DIRTY DAVE
1
你解决过这个问题吗?现在似乎将视图设置为GONE会立即生效并且会中断转换管理器的动画,而以前不会出现这种情况? - Daniel Wilson
显示剩余3条评论

1

这个优秀的答案非常类似于这个问题。

我注意到约束布局需要设置得非常具体 - 如果您将要设置为GONE的视图与其兄弟视图有约束关系,则这些约束关系似乎优先于任何转换管理器动画,即将视图设置为GONE只会立即使其消失而不是平滑地动画化,因为其他视图的约束条件立即生效。

我的解决方案是使用一个指南线,并将两个视图约束到它上面,并为转换管理器设置GuidelineBegin。这只是另一个可能有帮助的选项:

        val rootView = binding.constraintLayout
        val constraintSet = ConstraintSet()
        constraintSet.clone(rootView)
        val transition = AutoTransition()
        transition.duration = 150L
        transition.excludeTarget(R.id.orders_recycler_view, true)

        constraintSet.setGuidelineBegin(binding.guideline.id, if (showingDetailView) 0.px else 64.px)
        TransitionManager.beginDelayedTransition(rootView as ViewGroup, transition)
        constraintSet.applyTo(rootView)

0
Kotlin 解决方案
  1. 在任何你想要的地方调用该方法。使用FALSE来滑出,TRUE来滑入。

  2. targetView = 你想要滑入/滑出的视图

  3. rootLayout = 目标视图所在的主布局

  4. 在这个例子中,它将从右侧滑动到左侧。如果你想要从左侧到右侧,请将Gravity.END更改为Gravity.START

     private fun shareSlideInOut(show: Boolean) {
         val slide = Slide(Gravity.END)
         slide.duration = 450
         slide.addTarget(targetView)
         slide.interpolator = AccelerateDecelerateInterpolator()
         TransitionManager.beginDelayedTransition(rootLayout, slide)
         shareCodeLayout.visibility = if (show) View.VISIBLE else View.GONE
     }
    

0
创建这些动画
向上滑动
<translate
    android:duration="400"
    android:fromYDelta="100%"
    android:toYDelta="0" />

向下滑动

<translate
    android:duration="400"
    android:fromYDelta="0"
    android:toYDelta="100%" />

当你想要设置布局可见时

binding.musicOptionsLayout.setVisibility(View.GONE); binding.musicOptionsLayout.startAnimation(AnimationUtils.loadAnimation(getApplicationContext(), R.anim.slide_down));

当你想要将布局设置为 Gone
binding.musicOptionsLayout.setVisibility(View.GONE); binding.musicOptionsLayout.startAnimation(AnimationUtils.loadAnimation(v.getContext(), R.anim.slide_down));

在XML上设置android:visibility="gone"
希望这能解决你的问题...

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接