2

我一直在尝试使用新的Android Design Support Library从材料设计指南中实现与此类似的布局。这似乎是要走的路,但它忽略了任何增加海拔的尝试。此外,如果我将高度设置为低于 144dp 的任何值,则会弹出,但不会返回。这是我的xml:CollapsingToolbarLayoutAppBarLayoutFloatingActionButton

<android.support.design.widget.CoordinatorLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:fitsSystemWindows="true">

<android.support.design.widget.AppBarLayout
    android:id="@+id/appbar"
    android:layout_width="match_parent"
    android:layout_height="144dp"
    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"
        app:expandedTitleMarginEnd="72dp"
        app:expandedTitleMarginStart="72dp"
        app:layout_scrollFlags="scroll|exitUntilCollapsed">

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

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

<android.support.v7.widget.RecyclerView
    android:id="@+id/recycler_view"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:scrollbars="vertical"
    app:layout_behavior="@string/appbar_scrolling_view_behavior"/>

<android.support.design.widget.FloatingActionButton
    android:id="@+id/fab"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_margin="@dimen/fab_margin"
    android:src="@drawable/ic_person_add_white_24dp"
    app:borderWidth="0dp"
    app:fabSize="mini"
    app:layout_anchor="@id/appbar"
    app:layout_anchorGravity="bottom|left|start"/>

4

3 回答 3

3

在深入研究源代码后,我发现FloatingActionButton, 当附加到 时AppBarLayout,设置为仅在可用空间为 时出现<=appBarLayout.getMinimumHeightForVisibleOverlappingContent(),即 2* 最小高度(Toolbar在本例中为 , 加上状态栏。所以在手机上的纵向,56*2+26 = 138dp。我通过将我的设置为 138dp 来确认这一点,这有效,而 137dp 无效。如果您想解决这个问题,您可以覆盖getMinimumHeightForVisibleOverlappingContent()inAppBarLayout或以下方法 in FloatingActionButton

public boolean onDependentViewChanged(CoordinatorLayout parent, FloatingActionButton child, View dependency) {
        if(dependency instanceof SnackbarLayout) {
            this.updateFabTranslationForSnackbar(parent, child, dependency);
        } else if(dependency instanceof AppBarLayout) {
            AppBarLayout appBarLayout = (AppBarLayout)dependency;
            if(this.mTmpRect == null) {
                this.mTmpRect = new Rect();
            }

            Rect rect = this.mTmpRect;
            ViewGroupUtils.getDescendantRect(parent, dependency, rect);
            if(rect.bottom <= appBarLayout.getMinimumHeightForVisibleOverlappingContent()) {
                if(!this.mIsAnimatingOut && child.getVisibility() == 0) {
                    this.animateOut(child);
                }
            } else if(child.getVisibility() != 0) {
                this.animateIn(child);
            }
        }
        return false;
    }

至于CollapsingToolbarLayout海拔,我还没有找到解决方法。

于 2015-06-01T15:22:23.930 回答
2

对于CollapsingToolbarLayout海拔,您可以在具有完成工作的CollapsingToolbarLayout.OffsetUpdateListener方法的子类中搜索onOffsetChanged

 if(Math.abs(verticalOffset) == scrollRange) {
     ViewCompat.setElevation(layout, layout.getTargetElevation());
 } else {
     ViewCompat.setElevation(layout, 0.0F);
 }
于 2015-07-21T20:19:01.000 回答
2

关于立面,折叠的工具栏布局在未折叠时显式删除了立面*。它似乎已被归档为错误:

https://code.google.com/p/android/issues/detail?id=192553&q=elevation&colspec=ID%20Status%20Priority%20Owner%20Summary%20Stars%20Reporter%20Opened

(正如@Ben 在他的回答和对源代码的引用中所说)

直接链接到代码(当前,第 1062 行): https ://android.googlesource.com/platform/frameworks/support/+/master/design/src/android/support/design/widget/CollapsingToolbarLayout.java#1062

if (Math.abs(verticalOffset) == scrollRange) {
    // If we have some pinned children, and we're offset to only show those views,
    // we want to be elevate
    ViewCompat.setElevation(layout, layout.getTargetElevation());
} else {
    // Otherwise, we're inline with the content
    ViewCompat.setElevation(layout, 0f);
}
于 2016-02-23T21:26:43.747 回答