1

Я пытался реализовать макет similar to this из руководства по разработке материалов, используя новый Android Design Support Library. Кажется, что это CollapsingToolbarLayout, но он игнорирует любую попытку добавить возвышение. Кроме того, если я установил высоту AppBarLayout на что-нибудь около 144 дп, то 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 * минимальный height (Toolbar, в данном случае), плюс строка состояния. Так в портрете на телефоне, 56 * 2 + 26 = 138 дп. Я подтвердил это, установив мой на 138dp, который работает, и 137dp этого не делает. Если вы хотите, чтобы обойти эту проблему, вы можете переопределить getMinimumHeightForVisibleOverlappingContent() в AppBarLayout, или следующий метод в 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 высоты можно найти в подклассе CollapsingToolbarLayout.OffsetUpdateListener, который имеет метод onOffsetChanged делает работу

if(Math.abs(verticalOffset) == scrollRange) { 
    ViewCompat.setElevation(layout, layout.getTargetElevation()); 
} else { 
    ViewCompat.setElevation(layout, 0.0F); 
} 
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); 
}