Android官方悬停效果原理,Android之AppBarLayout实现悬停吸附伸缩效果

前几天看到这样一个UI效果,然后自己也仿照实现了下:

56162cce393e

开眼app个人中心.gif

看着挺酷的,也有很多App都用到了这个UI效果,比如开眼App和沪江开心词场就用到了.

所以下面就来简单实现一下这个UI效果吧.

组合三剑客

实现上面的UI效果需要将这三剑客的组合起来用,下面先介绍下这三个控件:

AppBarLayout:

1.AppBarLayout简单介绍

AppBarLayout是android.support:design包中的支持的控件,继承自LinearLayout,实际上就是一个垂直分布的LinearLayout.父类视图结构如下:

public class AppBarLayout

extends LinearLayout

java.lang.Object

↳ android.view.View

↳ android.view.ViewGroup

↳ android.widget.LinearLayout

↳ android.support.design.widget.AppBarLayout

其中官方文档中有这么两句话尤为重要:

This view depends heavily on being used as a direct child within a CoordinatorLayout. If you use AppBarLayout within a different ViewGroup, most of it's functionality will not work.

AppBarLayout also requires a separate scrolling sibling in order to know when to scroll. The binding is done through the AppBarLayout.ScrollingViewBehavior behavior class, meaning that you should set your scrolling view's behavior to be an instance of AppBarLayout.ScrollingViewBehavior.

意思就是说AppBarLayout 必须作为CoordinatorLayout的直接子类,否则很多功能是无法实现的.并且AppBarLayout 必须有一个能滚动的兄第ScrollView (实现了NestedScrollView,listview不可以哦),以此来通知AppBarLayout 何时进行滚动,兄弟View必须实现以下标识:

app:layout_behavior="@string/appbar_scrolling_view_behavior"

官方给出的例子如下:

xmlns:android="http://schemas.android.com/apk/res/android"

xmlns:app="http://schemas.android.com/apk/res-auto"

android:layout_width="match_parent"

android:layout_height="match_parent">

android:layout_width="match_parent"

android:layout_height="match_parent"

app:layout_behavior="@string/appbar_scrolling_view_behavior">

android:layout_height="wrap_content"

android:layout_width="match_parent">

...

app:layout_scrollFlags="scroll|enterAlways"/>

...

app:layout_scrollFlags="scroll|enterAlways"/>

2.AppBarLayout的具体使用

AppBarLayout直接子View的几种响应方式

AppbarLayout 可以指定当某个可滑动的兄弟View滑动手势改变时AppbarLayout 内部直接子View的响应动作,只要通过app:layout_scrollFlags属性来指定响应动作,layout_scrollFlags有5种响应动作,下面简单介绍下:

app:layout_scrollFlags="scroll"

当子view设置响应动作为app:layout_scrollFlags="scroll"时,子view会随ScrollView 的滚动而滚动,就相当于这时的子view变成了ScrollView 的item了,会跟随item一起滚动.

android:layout_width="match_parent"

android:layout_height="?attr/actionBarSize"

app:title="AppbarLayout"

app:titleTextColor="@color/white"

app:layout_scrollFlags="scroll"

>

app:layout_scrollFlags="scroll|enterAlways"

当子view设置响应动作为app:layout_scrollFlags="scroll|enterAlways"时,当ScrollView 向下滑动时,子View 将直接向下滑动,而不管ScrollView 是否在滑动。

android:layout_width="match_parent"

android:layout_height="?attr/actionBarSize"

app:title="AppbarLayout"

app:titleTextColor="@color/white"

app:layout_scrollFlags="scroll|enterAlways"

/>

3.app:layout_scrollFlags="scroll|enterAlways|enterAlwaysCollapsed"

当子view设置响应动作为app:layout_scrollFlags="scroll|enterAlways|enterAlwaysCollapsed"时,

当ScrollView 向下滑动的时候,子View(设置了enterAlwaysCollapsed 的子View)下滑至折叠的高度,当ScrollView 到达滑动范围的结束值的时候,滑动View剩下的部分开始滑动。这个折叠的高度是通过子View的minimum height (最小高度)指定的。

简单来说,就是第二种的加强版,当ScrollView 向下滑动时候,子view先露出半个头,当ScrollView 下滑到顶时,子view的头就全露出来了.

android:layout_width="match_parent"

android:layout_height="200dp"

android:minHeight="?attr/actionBarSize"

app:title="AppbarLayout"

android:gravity="bottom"

android:layout_marginBottom="25dp"

app:titleTextColor="@color/white"

app:layout_scrollFlags="scroll|enterAlways|enterAlwaysCollapsed"

/>

4.app:layout_scrollFlags="scroll|exitUntilCollapsed"

当子view设置响应动作为app:layout_scrollFlags="scroll|exitUntilCollapsed"时,

当ScrollView 向上滑动时,子View先响应滑动事件,滑动至折叠高度,也就是通过minimum height 设置的最小高度后,就固定不动了,再把滑动事件交给 scrollview,然后 scrollview才开始滑动。

android:layout_width="match_parent"

android:layout_height="200dp"

android:minHeight="?attr/actionBarSize"

app:title="AppbarLayout"

android:gravity="bottom"

app:titleTextColor="@color/white"

app:layout_scrollFlags="scroll|exitUntilCollapsed"

/>

app:layout_scrollFlags="scroll|snap"

当子view设置响应动作为app:layout_scrollFlags="scroll|snap"时,当ScrollView 下滑到顶部时,如果子view只露出30%的话,子view就会自动折叠回去,如果露出60%的话,就会自动展开.

简单来说,就是具有弹性且遵守就近原则,露的小就干脆不露头了,露的大,就全部出来了.

android:layout_width="match_parent"

android:layout_height="200dp"

android:minHeight="?attr/actionBarSize"

app:title="AppbarLayout"

android:gravity="bottom"

app:titleTextColor="@

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值