Android实现悬浮布局效果
利用google的design包里的CoordinatorLayout和AppBarLayout即可快速便捷实现,先看一下实现的效果图,如下:
![](https://img.haomeiwen.com/i13722678/4da04c0a9d8194a3.gif)
<?xml version="1.0" encoding="utf-8"?>
<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"
tools:context=".ThirdActivity">
<android.support.design.widget.AppBarLayout
android:layout_width="match_parent"
android:layout_height="wrap_content">
<!--必须在layout_scrollFlags中添加scroll属性
代表着这个布局是可以被收纳的
-->
<TextView
android:background="@color/black"
android:textColor="@color/white"
android:gravity="center"
android:text="这是需要滑动的布局"
android:layout_width="match_parent"
app:layout_scrollFlags="scroll"
android:layout_height="200dp" />
<TextView
android:background="@color/blue"
android:text="这是需要悬浮的布局"
android:textColor="@color/white"
android:gravity="center"
android:layout_width="match_parent"
android:layout_height="100dp" />
</android.support.design.widget.AppBarLayout>
<!--这里必须添加layout_behavior
这里的意思是,把AppBarLayout和RecyclerView进行绑定在一块
从而进行滑动的相应事件处理
-->
<android.support.v7.widget.RecyclerView
android:id="@+id/recyclerview"
android:layout_width="match_parent"
app:layout_behavior="@string/appbar_scrolling_view_behavior"
android:layout_height="wrap_content"></android.support.v7.widget.RecyclerView>
</android.support.design.widget.CoordinatorLayout>
实现要点如下:
-
首先需要用CoordinatorLayout包住AppBarLayout
-
顶部可以滚动隐藏和悬停的部分都放在AppBarLayout里面
-
与AppBarLayout平级的部分放一个带有可滚动的View,比如上面的例子RecyclerView
-
在第2步中可以滚动隐藏的View里面加上app:layout_scrollFlags="scroll"
-
在第3步添加的可滚动的View加上app:layout_behavior="@string/appbar_scrolling_view_behavior"
很多萌新在看见behavior是有点懵b的,我也比较懵,其实这是一个映射路径,最终指向desing包里面的一个appbar_scrolling_view_behavior类,如图:
![](https://img.haomeiwen.com/i13722678/5196141bee7cbfdb.png)
我们可以继承这个类 写自定义的,也可以通过反射,去修改滑动的效果,实现一些状态栏渐变的效果
自定义Behavior可以选择重写以下的几个方法有:
onInterceptTouchEvent():是否拦截触摸事件
onTouchEvent():处理触摸事件
layoutDependsOn():确定使用Behavior的View要依赖的View的类型
onDependentViewChanged():当被依赖的View状态改变时回调
onDependentViewRemoved():当被依赖的View移除时回调
onMeasureChild():测量使用Behavior的View尺寸
onLayoutChild():确定使用Behavior的View位置
onStartNestedScroll():嵌套滑动开始(ACTION_DOWN),确定Behavior是否要监听此次事件
onStopNestedScroll():嵌套滑动结束(ACTION_UP或ACTION_CANCEL)
onNestedScroll():嵌套滑动进行中,要监听的子 View的滑动事件已经被消费
onNestedPreScroll():嵌套滑动进行中,要监听的子 View将要滑动,滑动事件即将被消费
(但最终被谁消费,可以通过代码控制)
onNestedFling():要监听的子 View在快速滑动中
onNestedPreFling():要监听的子View即将快速滑动
至于怎么实现效果,就要看你的需求了。