FAB имеет странный пробел после добавления пользовательского поведения координатора в Pre-Lollipop

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

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

<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 с и без поведения

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);
    }
}
Другие вопросы по тегам