1

我一直試圖從材料設計指南實現佈局similar to this,使用新的Android Design Support LibraryCollapsingToolbarLayout似乎是要走的路,但它忽略了任何添加高程的嘗試。此外,如果我將AppBarLayout的高度設置爲大約144dp以下的任何值,FloatingActionButton將彈出,但不返回。這裏是我的xml:CollapsingToolbarLayout提升不工作和錨定FloatingActionButton不返回

<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"/> 

回答

2

跳水到源代碼後,我發現了FloatingActionButton,附着在AppBarLayout時,被設置爲只出現時,可用空間爲<=appBarLayout.getMinimumHeightForVisibleOverlappingContent(),這是2 *最低高度(在這種情況下爲Toolbar),再加上狀態欄。因此,在手機上的肖像,56 * 2 + 26 = 138dp。我通過將我的設置爲138dp來確認這一點,該工作可行,而137dp不會。如果要解決這個問題,你可以在AppBarLayout覆蓋getMinimumHeightForVisibleOverlappingContent(),或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擡高,我還沒有找到一個解決辦法呢。

2

對於CollapsingToolbarLayout擡高,你可以在其中有方法onOffsetChanged做的工作

if(Math.abs(verticalOffset) == scrollRange) { 
    ViewCompat.setElevation(layout, layout.getTargetElevation()); 
} else { 
    ViewCompat.setElevation(layout, 0.0F); 
} 
2

關於海拔子CollapsingToolbarLayout.OffsetUpdateListener搜索,倒塌工具欄佈局顯式刪除海拔不倒塌時*。它已被提起,因爲它似乎是一個錯誤:

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); 
}