代码之家  ›  专栏  ›  技术社区  ›  Faisal Shaikh

Android-在用户触摸时显示/隐藏应用程序中的工具栏,带有向上滑动和向下滑动的动画

  •  0
  • Faisal Shaikh  · 技术社区  · 6 年前

    我已经实现了当用户使用以下命令滚动列表时显示/隐藏工具栏 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);
            }
    

    但唯一的问题是,工具栏在隐藏或显示时不会动画化。我希望工具栏在隐藏和显示时可以上下滑动。

    0 回复  |  直到 6 年前
        1
  •  0
  •   Hai Hack    6 年前

    执行单击时使用以下代码:

    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);
    }
    
        2
  •  0
  •   Yunis Rasulzade    6 年前

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

    Depenedency implementation '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>
    
        3
  •  0
  •   Faisal Shaikh    6 年前
    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();
    } 
    
    推荐文章