如何使用 insetEdge 和 dodgeInsetEdges 避免重叠视图

How to avoid overlapping views with insetEdge and dodgeInsetEdges

我有这样的布局:

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

    <android.support.v4.widget.NestedScrollView
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        app:layout_behavior="@string/appbar_scrolling_view_behavior">

        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:orientation="vertical">

            <TextView
                android:id="@+id/listitem_1"
                android:layout_width="match_parent"
                android:layout_height="100dp"
                android:layout_margin="16dp"
                android:gravity="center"
                android:text="item 1"
                android:background="#ff0000"/>

            <TextView
                android:id="@+id/listitem_2"
                android:layout_width="match_parent"
                android:layout_height="100dp"
                android:layout_margin="16dp"
                android:gravity="center"
                android:text="item 2"
                android:background="#ff0000"/>

            <TextView
                android:id="@+id/listitem_3"
                android:layout_width="match_parent"
                android:layout_height="100dp"
                android:layout_margin="16dp"
                android:gravity="center"
                android:text="item 3"
                android:background="#ff0000"/>

            <View
                android:id="@+id/scroller_bottom_bar"
                android:layout_width="match_parent"
                android:layout_height="100dp"
                android:background="#0000ff" />
        </LinearLayout>
    </android.support.v4.widget.NestedScrollView>

    <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"
        app:layout_anchor="@id/scroller_bottom_bar"
        app:layout_anchorGravity="end"
        app:srcCompat="@android:drawable/ic_dialog_email" />
</android.support.design.widget.CoordinatorLayout>

转换为以下 UI 动画:

如您所见,浮动操作按钮与蓝色底部视图重叠。我想避免这种情况。我该怎么做?

这可以通过添加 insetEdgedodgeInsetEdges 属性来解决。基本上,insetEdgeCoordinatorLayout 知道它的另一个 children 可以躲避它,如果他们愿意的话。在其他视图上设置 dodgeInsetEdges 让他们实际上躲避 dodge-able 视图(由 insetEdge 标记)。

将原来的 xml 布局重写为:

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

    <android.support.v4.widget.NestedScrollView
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        app:layout_behavior="@string/appbar_scrolling_view_behavior">

        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:orientation="vertical">

            <TextView
                android:id="@+id/listitem_1"
                android:layout_width="match_parent"
                android:layout_height="100dp"
                android:layout_margin="16dp"
                android:gravity="center"
                android:text="item 1"
                android:background="#ff0000"/>

            <TextView
                android:id="@+id/listitem_2"
                android:layout_width="match_parent"
                android:layout_height="100dp"
                android:layout_margin="16dp"
                android:gravity="center"
                android:text="item 2"
                android:background="#ff0000"/>

            <TextView
                android:id="@+id/listitem_3"
                android:layout_width="match_parent"
                android:layout_height="100dp"
                android:layout_margin="16dp"
                android:gravity="center"
                android:text="item 3"
                android:background="#ff0000"/>

            <View
                android:id="@+id/scroller_bottom_bar"
                android:layout_width="match_parent"
                android:layout_height="100dp"
                android:background="#0000ff" />
        </LinearLayout>
    </android.support.v4.widget.NestedScrollView>

    <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"
        app:layout_anchor="@id/fab_anchor"
        app:layout_anchorGravity="end"
        app:layout_dodgeInsetEdges="bottom"
        app:srcCompat="@android:drawable/ic_dialog_email" />

    <View
        android:id="@+id/fab_anchor"
        android:layout_width="match_parent"
        android:layout_height="1dp"
        app:layout_anchor="@id/scroller_bottom_bar"
        app:layout_insetEdge="bottom" />
</android.support.design.widget.CoordinatorLayout>

应该导致预期的 UI 行为: