FolpsingToolbarLayout在单独片段中的行为

时间:2017-03-17 20:39:43

标签: android material-design android-collapsingtoolbarlayout

我需要实现与CollapsingToolbarLayout类似的行为。两个巨大的差异使得这个小部件不适合我的目的:

  1. 这不是工具栏的一部分。它是通过位于工具栏正下方的片段进行充气的布局,但不能是工具栏的子代。

  2. 当我滚动屏幕时,我希望上框架布局(' header_fragment_container',其中填充了子片段),就像CollapsingToolbarLayout一样折叠。实际上,我希望用不同的布局替换它。

  3. 是否有人知道可以在应用栏/工具栏之外处理此可折叠的适当窗口小部件或第三方库?

    以下是目前存在的片段的xml:

    <ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:fillViewport="true">
    
        <FrameLayout
            android:id="@+id/header_fragment_container"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:background="#fff"/>
    
        <FrameLayout
            android:id="@+id/content_fragment_container"
            android:layout_width="match_parent"
            android:layout_height="match_parent"/>
    
    
    </ScrollView>
    

1 个答案:

答案 0 :(得分:0)

您可以实现自定义解决方案 - 聆听滚动更改并适当地进行布局修改:

scrollView.setOnScrollChangeListener(new View.OnScrollChangeListener() {

        private static final int THRESHOLD = 150;
        private int scrolledDistance = 0;
        private boolean toolbarVisible = true;

        @Override
        public void onScrollChange(View view, int scrollX, int scrollY, int oldScrollX, int oldScrollY) {
            if (view.getScrollY() == 0) {
                if(!toolbarVisible) {
                    toolbarVisible = true;
                    showToolbar();
                }
            } else {
                if (toolbarVisible && scrolledDistance > THRESHOLD) {
                    toolbarVisible = false;
                    scrolledDistance = 0;
                    hideToolbar();
                } else if (!toolbarVisible && scrolledDistance < -THRESHOLD) {
                    toolbarVisible = true;
                    scrolledDistance = 0;
                    showToolbar();
                }
            }

            if ((toolbarVisible && scrollY - oldScrollY > 0) || (!toolbarVisible && scrollY - oldScrollY < 0)) {
                scrolledDistance += scrollY - oldScrollY;
            }
        }
    });

private void showToolbar() {
    // show the Toolbar and make the necessary layout modifications
    final ObjectAnimator animator = ObjectAnimator.ofFloat(toolbar, "y", 0);
    animator.setDuration(1000);
    animator.start();
}

private void hideToolbar() {
    // hide the Toolbar and make the necessary layout modifications
    final ObjectAnimator animator = ObjectAnimator.ofFloat(toolbar, "y", -getActionBarHeight());
    animator.setDuration(1000);
    animator.start();
}