安卓系统-在用户触摸时显示/隐藏应用程序中的工具栏,并提供上下滑动动画



当用户使用CoordinatorLayout滚动列表时,我已经实现了显示/隐藏工具栏。现在,我正在android应用程序中使用用户触摸屏幕上的任何位置来显示/隐藏工具栏。我试过这个代码,它运行良好:

if (toolbar.getVisibility() == View.VISIBLE) {
toolbar.setVisibility(View.GONE);
getWindow().addFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN);
} else {
getWindow().clearFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN);
toolbar.setVisibility(View.VISIBLE);
}

但唯一的问题是工具栏在隐藏或显示时并没有动画。我希望工具栏在隐藏和显示时能够上下滑动。

您可以使用运动布局预览:https://giphy.com/gifs/jpn6QpmT3dBtf3XYIS

Depenedencyimplementation 'androidx.constraintlayout:constraintlayout:2.0.0-beta6'

在布局的"设计"页面上,找到"组件树",右键单击根布局,然后您会看到"转换为MotionLayout"选项。建议这样做。因为它会自动生成保存MotionScene的XML文件夹。如果你不想这样做,你可以手动创建一个名为xml的文件夹,并将activity_main_scene.xml放入其中(

activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.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"
android:id="@+id/root"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent">

<androidx.constraintlayout.motion.widget.MotionLayout
android:id="@+id/motion_base"
android:layout_width="match_parent"
android:layout_height="match_parent"
app:layoutDescription="@xml/activity_main_scene"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent">

<androidx.appcompat.widget.Toolbar
android:id="@+id/toolbar"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="?attr/colorPrimary"
android:minHeight="?attr/actionBarSize"
android:theme="?attr/actionBarTheme"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />

</androidx.constraintlayout.motion.widget.MotionLayout>
</androidx.constraintlayout.widget.ConstraintLayout>

activity_main_scene.xml(位于xml文件夹内,也位于res文件夹内(

<?xml version="1.0" encoding="utf-8"?>
<MotionScene xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:motion="http://schemas.android.com/apk/res-auto">
<Transition
motion:duration="1000"
motion:constraintSetEnd="@+id/end"
motion:constraintSetStart="@id/start">
<OnClick
motion:clickAction="transitionToEnd"
motion:targetId="@+id/motion_base"/>
</Transition>
<ConstraintSet android:id="@+id/start" />
<ConstraintSet android:id="@+id/end">
<Constraint
android:id="@+id/toolbar"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:visibility="invisible"/>
</ConstraintSet>
</MotionScene>

点击时使用以下代码:

protected void toggleToolbarView() {
isShown = !isShown;
Transition transition = new Slide(Gravity.TOP);
transition.setDuration(200);
transition.addTarget(toolbar);
TransitionManager.beginDelayedTransition(toolbar, transition);
toolbar.setVisibility(isShownHeaderFooter ? View.VISIBLE : View.GONE);
}
if (toolbar.getVisibility() == View.VISIBLE) {
appbar.animate().translationY(-112).setDuration(600L)
.withEndAction(new Runnable() {
@Override
public void run() {
toolbar.setVisibility(View.GONE);
}
}).start();
} else {
toolbar.setVisibility(View.VISIBLE);
appbar.animate().translationY(0).setDuration(600L).start();
} 

最新更新