2015-10-04 4 views
0

Я работаю с новыми FloatingActionButton и CoordinatorLayout в библиотеке поддержки дизайна. Когда я пытаюсь добавить пользовательский координатор поведение на FloatActionButton он работает отлично на леденец +, но на Pre-леденце есть некоторая странная Маржа разрыва на FloatActionButtonУ FAB есть странный разрыв после добавления пользовательского поведения координатора на Pre-Lollipop

Моей основная раскладка деятельности

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