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

use*_*104 2 android android-coordinatorlayout

我有这样的布局:

<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>
Run Code Online (Sandbox Code Playgroud)

转换为以下 UI 动画:

在此输入图像描述

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

use*_*104 6

insetEdge这可以通过添加和属性来解决dodgeInsetEdges。基本上,insetEdge让孩子CoordinatorLayout知道如果其他孩子愿意的话可以躲避它。在其他视图上设置dodgeInsetEdges可以让它们实际上躲避可躲避的视图(标记为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>
Run Code Online (Sandbox Code Playgroud)

应该会产生预期的 UI 行为:

在此输入图像描述