2015-10-04 22 views
0

我正在設計支持庫中使用新的FloatingActionButton和CoordinatorLayout。當我嘗試在FloatActionButton添加自定義協調員行爲它的工作完美的棒棒堂+,但前棒棒堂有上FloatActionButton在前棒棒糖上添加自定義協調員行爲後,FAB存在奇怪的間隙

一些奇怪的差距保證金

我的主活動佈局

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

    <android.support.design.widget.AppBarLayout 
     android:layout_height="wrap_content" 
     android:layout_width="match_parent"> 

     <android.support.v7.widget.Toolbar 
      android:id="@+id/toolbar" 
      android:layout_width="match_parent" 
      android:layout_height="?attr/actionBarSize" 
      android:background="?attr/colorPrimary" 
      app:layout_scrollFlags="scroll|enterAlways" /> 
    </android.support.design.widget.AppBarLayout> 

    <RelativeLayout 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     android:paddingLeft="16dp" 
     android:paddingRight="16dp" 
     android:paddingTop="16dp" 
     android:paddingBottom="16dp" 
     app:layout_behavior="@string/appbar_scrolling_view_behavior"> 

     <TextView 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:text="Hello World!" /> 
    </RelativeLayout> 

    <android.support.design.widget.FloatingActionButton 
     android:id="@+id/fab" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_gravity="bottom|end" 
     android:layout_margin="16dp" 
     android:src="@android:drawable/ic_dialog_email" 
     app:layout_behavior="com.test.fabdemo.FloatingActionButtonBehavior" /> 
</android.support.design.widget.CoordinatorLayout> 

定製CoordinatorLayout行爲

public class FloatingActionButtonBehavior extends CoordinatorLayout.Behavior<FloatingActionButton> { 

    public FloatingActionButtonBehavior(Context context, AttributeSet attrs) { 
     super(context, attrs); 
    } 

    @Override 
    public boolean layoutDependsOn(CoordinatorLayout parent, FloatingActionButton button, View dependency) { 
     return dependency instanceof AppBarLayout; 
    } 

    @Override 
    public boolean onDependentViewChanged(CoordinatorLayout parent, FloatingActionButton floatingActionButton, View dependency) { 
     if (dependency instanceof AppBarLayout) { 
      AppBarLayout appBarLayout = (AppBarLayout) dependency; 
      CoordinatorLayout.LayoutParams lp = (CoordinatorLayout.LayoutParams) floatingActionButton.getLayoutParams(); 
      int bottomMargin = lp.bottomMargin; 
      int distanceToScroll = floatingActionButton.getHeight() + bottomMargin; 
      float ratio = ViewCompat.getY(appBarLayout)/(float) appBarLayout.getTotalScrollRange(); 
      ViewCompat.setTranslationY(floatingActionButton, -distanceToScroll * ratio); 
      return true; 
     } 
     return false; 
    } 
} 

在仿真器4.0.3結果與不行爲

enter image description hereenter image description here

回答

1

經過一番研究,我發現,FAB的保證金是默認行爲管理,所以要定製行爲從FloatActionButton.Behavior繼承就能解決問題

public class FloatingActionButtonBehavior extends FloatingActionButton.Behavior { 

    public FloatingActionButtonBehavior(Context context, AttributeSet attrs) { 
     super(); 
    } 

    @Override 
    public boolean layoutDependsOn(CoordinatorLayout parent, FloatingActionButton button, View dependency) { 
     return dependency instanceof AppBarLayout || super.layoutDependsOn(parent, button, dependency); 
    } 

    @Override 
    public boolean onDependentViewChanged(CoordinatorLayout parent, FloatingActionButton floatingActionButton, View dependency) { 
     if (dependency instanceof AppBarLayout) { 
      AppBarLayout appBarLayout = (AppBarLayout) dependency; 
      CoordinatorLayout.LayoutParams lp = (CoordinatorLayout.LayoutParams) floatingActionButton.getLayoutParams(); 
      int bottomMargin = lp.bottomMargin; 
      int distanceToScroll = floatingActionButton.getHeight() + bottomMargin; 
      float ratio = ViewCompat.getY(appBarLayout)/(float) appBarLayout.getTotalScrollRange(); 
      ViewCompat.setTranslationY(floatingActionButton, -distanceToScroll * ratio); 
      return true; 
     } 
     return super.onDependentViewChanged(parent, floatingActionButton, dependency); 
    } 
}