如何防止在CollapsingToolbarLayout到达顶部时停止滚动

时间:2016-04-05 11:29:02

标签: android android-coordinatorlayout android-collapsingtoolbarlayout

在CoordinatorLayout中滚动到达顶部时停止。因此用户必须再次滚动才能看到图像。是否可以继续滚动直到图像完全显示?

@ModelName.ColumnDateTime

1 个答案:

答案 0 :(得分:0)

您需要计算NestedScrollView的高度。首先更新您的xml布局并在工具栏中添加这些属性,并确保<includelayout="@layout/content_scrolling" />NestedScrollView并具有滚动视图行为。

app:layout_scrollFlags="scroll|exitUntilCollapsed"
app:layout_collapseMode="pin"

在您的活动中定义这些全局变量。

 private int screenHeight;
    private int linearLayoutHeight;
    private int toolbarHeight_org;
    private int toolbarHeight;

在onCreate活动方法

中执行此操作
    screenHeight = getScreenHeight(this);

    TypedValue typedValue = new TypedValue();
    getTheme().resolveAttribute(R.attr.colorPrimary, typedValue, true);
    final int colorPrimary = typedValue.data;

    final Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
    setSupportActionBar(toolbar);
    getSupportActionBar().setDisplayHomeAsUpEnabled(true);

    AppBarLayout appbar = (AppBarLayout) findViewById(R.id.appbar);
    final CoordinatorLayout.LayoutParams appbarLayoutParams = (CoordinatorLayout.LayoutParams)appbar.getLayoutParams();

    final ViewGroup.LayoutParams toolbarLayoutParams = toolbar.getLayoutParams();
    if (toolbarLayoutParams != null) {
        toolbarHeight_org = toolbarLayoutParams.height;
        toolbarHeight = toolbarLayoutParams.height;
    }

    final CollapsingToolbarLayout collapsingToolbar =
            (CollapsingToolbarLayout) findViewById(R.id.collapsing_toolbar);
    collapsingToolbar.setTitle(cheeseName);

    collapsingToolbar.setContentScrimColor(colorPrimary);
    collapsingToolbar.setExpandedTitleTextAppearance(R.style.ExpandedTitleTextAppearance);
    //collapsingToolbar.setCollapsedTitleTextAppearance(R.style.CollapsedTitleTextAppearance);

    final LinearLayout linearLayout = (LinearLayout) findViewById(R.id.linearLayout1);
    ViewTreeObserver observer = linearLayout.getViewTreeObserver();
    observer.addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
        @Override
        public void onGlobalLayout() {
            linearLayoutHeight = linearLayout.getHeight();
            if (linearLayoutHeight + toolbarHeight < screenHeight) {
                if (toolbarLayoutParams != null) {
                    toolbarLayoutParams.height = screenHeight - linearLayoutHeight - 20;
                    if (toolbarLayoutParams.height < toolbarHeight_org) {
                        toolbarLayoutParams.height = toolbarHeight_org;
                    }

                    int extended_text_size = (int) getResources().getDimension(R.dimen.expanded_text_size);

                    if (appbarLayoutParams.height - toolbarLayoutParams.height <= extended_text_size) {
                        int value = appbarLayoutParams.height - toolbarLayoutParams.height;
                        if (value < 0) {
                            appbarLayoutParams.height = toolbarLayoutParams.height - value + extended_text_size * 3;
                        } else {
                            appbarLayoutParams.height = toolbarLayoutParams.height + extended_text_size * 3;
                        }
                        if (appbarLayoutParams.height >= screenHeight) {
                            appbarLayoutParams.height = screenHeight;
                        }
                    }

                    // collapsingToolbar.setContentScrimColor(getResources().getColor(android.R.color.transparent));
                    if (toolbarLayoutParams.height > toolbarHeight_org) {
                        collapsingToolbar.setContentScrimColor(ContextCompat.getColor(mContext, android.R.color.transparent));
                    }
                }
            }
            // Removes the listener if possible
            ViewTreeObserver viewTreeObserver = linearLayout.getViewTreeObserver();
            if (viewTreeObserver.isAlive()) {
                if (Build.VERSION.SDK_INT < Build.VERSION_CODES.JELLY_BEAN) {
                    linearLayout.getViewTreeObserver().removeGlobalOnLayoutListener(this);
                } else {
                    linearLayout.getViewTreeObserver().removeOnGlobalLayoutListener(this);
                }
            }
        }
    });
    appbar.setExpanded(true);
}

获取屏幕高度方法

private int getScreenHeight(Context context) {
    int measuredHeight;
    Point size = new Point();
    WindowManager wm = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);

    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB_MR2) {
        wm.getDefaultDisplay().getSize(size);
        measuredHeight = size.y;
    } else {
        Display d = wm.getDefaultDisplay();
        measuredHeight = d.getHeight();
    }

    return measuredHeight;
}

以下是完整的xml活动布局,请根据此

更新您的活动

<android.support.design.widget.AppBarLayout
    android:id="@+id/appbar"
    android:layout_width="match_parent"
    android:layout_height="@dimen/detail_backdrop_height"
    android:fitsSystemWindows="true"
    android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar">

    <android.support.design.widget.CollapsingToolbarLayout
        android:id="@+id/collapsing_toolbar"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:fitsSystemWindows="true"
        app:contentScrim="?attr/colorPrimary"
        app:layout_scrollFlags="scroll|exitUntilCollapsed">

        <ImageView
            android:id="@+id/backdrop"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:fitsSystemWindows="false"
            android:scaleType="centerCrop"
            app:layout_collapseMode="parallax" />

        <android.support.v7.widget.Toolbar
            android:id="@+id/toolbar"
            android:layout_width="match_parent"
            android:layout_height="?attr/actionBarSize"
            app:layout_collapseMode="pin"
            app:popupTheme="@style/ThemeOverlay.AppCompat.Light" />

    </android.support.design.widget.CollapsingToolbarLayout>

</android.support.design.widget.AppBarLayout>

<android.support.v4.widget.NestedScrollView
    android:layout_width="match_parent"
    android:layout_height="wrap_content"            
    app:layout_behavior="@string/appbar_scrolling_view_behavior">

    <LinearLayout
        android:id="@+id/linearLayout1"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical">

        <android.support.v7.widget.CardView
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_margin="@dimen/card_margin">

            <LinearLayout
                style="@style/Widget.CardContent"
                android:layout_width="match_parent"
                android:layout_height="wrap_content">

                <TextView
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    android:text="Info"
                    android:textAppearance="@style/TextAppearance.AppCompat.Title" />

                <TextView
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    android:text="@string/cheese_ipsum" />

            </LinearLayout>

        </android.support.v7.widget.CardView>

    </LinearLayout>

</android.support.v4.widget.NestedScrollView>