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

vshtjzan  于 2023-01-15  发布在  Android
关注(0)|答案(4)|浏览(133)

我尝试使用Transition + Transition管理器将此视图滑入和滑出,但是当点击隐藏按钮使视图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>
xzabzqsa

xzabzqsa1#

不知道你的代码有什么问题。我已经创建了一个示例,只是尝试下面的代码工作正常。请务必添加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;
}
}
x4shl7ld

x4shl7ld2#

创建这些动画
滑上

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

当您要设置布局时

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

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

sf6xfgos

sf6xfgos3#

优秀的答案here与这个问题非常相似。
我注意到约束布局需要非常具体地设置-如果您设置为“已完成”的视图被约束到它的兄弟视图,则这些约束似乎优先于任何过渡管理器动画,即,将一个视图设置为“已完成”会立即杀死它,而不是平滑地设置动画,因为其他视图的约束会立即生效。
我的解决方案是使用一个指南,并将两个视图约束到它,然后为过渡管理器设置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)
iqxoj9l9

iqxoj9l94#

Kotlin溶液
1.在任何需要的地方调用该方法。使用FALSE表示滑出,使用TRUE表示滑入。
1.targetView=要滑入/滑出的视图
1.rootLayout=targetView所在的主布局
1.在这个例子中,它将从右向左滑动。如果你想从左向右滑动,将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
 }

相关问题