【吸顶效果 CoordinatorLayout AppBarLayout CollapsingToolbarLayout NestedScrollView】

总结

怎样实现吸顶,用白话说:

  • 外层用CooridnateLayout,里面放NestScrollView、CoordinateLayout、AppBarLayout
    • CooridnateLayout协调子View的Layout,注意Gravity的使用,防止View间有空隙
  • 滑动组件放在NestScrollView、CoordinateLayout里
    • NestScrollView添加behavior
    • 实战遇到问题:n层布局后是 一个RecyclerView,那用CoordinateLayout,用NestScrollView遇到问题(可以话,但是没有上拉、下拉刷新了)
  • AppBarLayout里放随 滑动组件 一起动的View
    • 直接子View,跟着一起滑动 (吸顶,不滑到消失)
    • CollapsingToolbarLayout的子View (滑到消失)

GitHub Demo 地址

CoordinatorLayout

是一个超级FrameLayout,协调各个子布局

应用场景
  1. 设置对View的Action产生相应的behavior(行为)
  2. 设置View 的依赖关系(设置 layout_anchor),以此产生联动效果
    • 做动画时用
    • 可跨层级调用
API
  • Behaviors
    • 抽屉滑动效果
    • 钉主的Button
  • setAnchorId
    • 任意的子View,例如实现一个View相对于另一个View的悬浮效果了
  • LayoutParams.insetEdge
    • 值为Gravity的枚举,设置如何嵌套在CoordinatorLayout中
  • LayoutParams.dodgeInsetEdges
    • 值为Gravity的枚举,相同的值会一起移动
behavior接口例子
 
 //是否依赖
     public boolean layoutDependsOn(@NonNull CoordinatorLayout parent, @NonNull V child,
                @NonNull View dependency) {
// 联动效果
     public boolean onDependentViewChanged(CoordinatorLayout parent, YourView child, View dependency) {

// 自定义behavior
public class CustomBehavior extends CoordinatorLayout.Behavior<CircleImageView> {

    @Override
    public boolean layoutDependsOn(CoordinatorLayout parent, CircleImageView child, View dependency) {
        return dependency instanceof Toolbar;
    }

    @Override
    public boolean onDependentViewChanged(CoordinatorLayout parent, CircleImageView child, View dependency) {
        int[] dependencyLocation = new int[2];
        int[] childLocation = new int[2];

        dependency.getLocationInWindow(dependencyLocation);
        child.getLocationInWindow(childLocation);

        float diff = childLocation[1] - dependencyLocation[1];
        if(diff > 0) {
            float scale = diff/(float)childLocation[1];
            Log.d(TAG, "scale == " + scale);
            child.setScaleX(1+scale);
            child.setScaleY(1+scale);
        }
        return false;
    }
 

AppBarLayout

  • orientation为vertical的LinearLayout
  • 用于实现Material Design中 TitleBar的滑动效果
    • AppBarLayout.LayoutParams.setScrollFlags(int)
    • app:layout_scrollFlags.
应用情景
  • 一般为CoordinatorLayout的 直接子布局(否则部分属性不能用)
  • 一般有个 兄弟View(如NestScrollView),来判断何时滑动
  • 用于包含ToolBar
  • 为子View提供期望的scroll 行为(子View通过 app:layout_scrollFlags 设置)
    • scroll 是否可以scroll出屏幕
    • enterAlways
      • 和scroll一起用: 向上滑 收起;向下滑,可见
      • 情景:用于 快速返回顶部 那种icon
    • enterAlwaysCollapsed
      • 配合 app:layout_scrollFlags="scroll|enterAlways|enterAlwaysCollapsed" android:minHeight="20dp"
      • collpase不可见,滑动超过 minHeight,才漏出来
    • exitUntilCollapsed
      • view will collapse during an upward scrolling motion until the minHeight threshold is met,
      • View在 向上滑动超过 minHeight阈值时 不可见
    • snap (拍下去,收起的意思)滑到最后 部分可见时,是否要归到最近的边缘。防止出现 半显示半不显示的状态
      • (配合scroll使用, app:layout_scrollFlags="snap|scroll")
API
AppBarLayout extends LinearLayout implements CoordinatorLayout.AttachedBehavior
	- Behavior getBehavior(); 

CollapsingToolbarLayout

collapse坍缩 expand展开, 跟随滑动可有 expand变为collapse; scrim 亚麻布,遮盖物

  • Toolbar 的一个包装类,实现collapsing app bar效果(就是隐藏部分View)
  • 设计为AppBarLayout的直接子View
  • FrameLayout
  • 相关教程
  • 测试的设置 layout_scrollFlags 无效
属性
  • layout_collapseMode
    • pin - 设置为这个模式时,当CollapsingToolbarLayout完全收缩后,Toolbar还可以保留在屏幕上。
      • 测试的对于普通View没啥区别
    • parallax - 设置为这个模式时,在内容滚动时,CollapsingToolbarLayout中的View(比如ImageView)也可以同时滚动,
      实现视差滚动效果,通常和layout_collapseParallaxMultiplier(设置视差因子)搭配使用。
      • layout_collapseParallaxMultiplier(视差因子) - 设置视差滚动因子,值为:0~1。
特性
  • Collapsing title (collapse相对小于 expand时的title字体)
    • setTitle(CharSequence)
  • Content scrim
  • Status bar scrim
    • setStatusBarScrim(Drawable)
    • LOLLIPOP版本有用
  • Parallax scrolling children (视差,折叠效果)
    • parallax fashion
  • Pinned position children
    • 在collapsing (坍缩)时,View固定在某个globally 坐标上
    • CollapsingToolbarLayout.LayoutParams.COLLAPSE_MODE_PIN.
情景

下拉在minHeight(50dp)时,才漏出被collapse的View

 <com.google.android.material.appbar.CollapsingToolbarLayout
                app:layout_scrollFlags="scroll|enterAlways|enterAlwaysCollapsed"
                android:minHeight="50dp"

总结

  • CoordinatorLayout 作为超级FrameLayout 统筹全局
    • 处理子View的联动,自定义behavior(view1滑动,view2跟着放大了)
    • 子View之间跨层级跟踪,设置layout_anchor (view1滑动,button1跟着滑动)
  • AppBarLayout作为vertical的LinearLayout
    • 侧重于滑动,对子View产生的影响
    • 子View一般是相应滑动,又不会消失(collapse 坍缩)
  • CollapsingToolbarLayout
    • 作为AppBarLayout的直接子View
    • 侧重于 因滑动而消失的View(Parallax折叠: 大背景图、超长折叠文字)

注意

  • ScrollView不要随便加Gravity,会导致ScrollView和AppLayout之间空隙。Behavior 使ScrollView 在 AppLayout的下面。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: CoordinatorLayout是Android Support Library中的一个布局容器,它可以用来实现各种复杂的交互效。其中,顶效就是其中一种,可以通过设置app:layout_behavior属性为ScrollingViewBehavior来实现。当滑动到一定位置时,该View就会固定在屏幕顶部,不再随着滑动而滑动。 ### 回答2: CoordinatorLayout是Android Support Library 中新加入的一个类,通过继承自FrameLayout,并与Behavior配合使用,在支持库中为我们提供了处理子View之间协作关系的能力,可以用来处理各种不同事件。其中一种常见的用法是顶效。 实现顶效的原理是设置一个向上滚动时将要被滚动过去的View,然后在CoordinatorLayout中通过Behavior与AppBarLayout配合使用。AppBarLayout作为CoordinatorLayout的一个子View,它的滑动事件可以通过Behavior处理,Behavior可以监听到AppBarLayout的滑动事件,在AppBarLayout即将被完全滑走的时候,将需要顶的View设置为可见,实现顶效。 具体的实现过程:首先,我们需要在布局文件中定义一个CoordinatorLayout容器和一个AppBarLayout子View。在AppBarLayout中,可以定义一个Toolbar和一个可折叠的布局。 在需要顶的View上添加app:layout_behavior属性,属性值为自定义顶Behavior的名称。在Behavior中监听AppBarLayout的滑动事件,通过onDependentViewChanged()方法可以拿到AppBarLayout子View的滑动状态,根据状态的变化实现对需要顶的View的操作。拿到对应的View后,可以通过View的LayoutParams动态的修改其位置和大小。 因为CoordinatorLayout和Behavior都是在Android Support Library中新出现的,而且这种用法比较复杂,需要处理很多滑动的事件。所以,相对于传统的LinearLayout和RelativeLayout等布局,CoordinatorLayout的使用不太常见,需要有一定的技术积累和实践经验。 总的来说,通过使用CoordinatorLayout顶Behavior能够很方便的实现顶效,而且该方法还可以扩展至其他场景,例如悬浮按钮等。但是需要注意的是,在使用CoordinatorLayout的时候,其它的子View需要设置为可滑动的,否则Behavior不会生效。 ### 回答3: CoordinatorLayout是Android Design Support Library中比较重要的一个控件,它作为一种Layout容器可以以托管子View的方式来实现各类高级UI效,包括顶效顶效常用于列表滑动时,当列表中的Header View全部被滑出屏幕外时,置顶的View就会固定在顶部,随着列表的滑动而滑动,直到下一个Header View完全显示出来时再次被顶掉。下面我将详细介绍CoordinatorLayout顶实现的实现步骤: 1.在xml布局文件中,将需要实现顶效的View包裹在NestedScrollView内,NestedScrollViewCoordinatorLayout提供的一个可滑动的Layout容器。 <?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" android:layout_width="match_parent" android:layout_height="match_parent"> <android.support.v4.widget.NestedScrollView android:layout_width="match_parent" android:layout_height="wrap_content"> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="vertical"> <!--顶部固定View--> <TextView android:id="@+id/top_view" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="Top View"/> <!--列表--> <android.support.v7.widget.RecyclerView android:id="@+id/recycler_view" android:layout_width="match_parent" android:layout_height="wrap_content"/> </LinearLayout> </android.support.v4.widget.NestedScrollView> </android.support.design.widget.CoordinatorLayout> 2.在Activity或Fragment中,获取需要顶的View,并通过CoordinatorLayout.LayoutParams设置Behavior属性为ScrollingViewBehavior,表示View是可以滑动的。 TextView topView = findViewById(R.id.top_view); CoordinatorLayout.LayoutParams params = (CoordinatorLayout.LayoutParams) topView.getLayoutParams(); params.setBehavior(new AppBarLayout.ScrollingViewBehavior()); 3.在xml布局文件中,设置悬浮的View(例如Toolbar)的app:layout_scrollFlags属性为scroll|enterAlways|snap,表示View在滑动时跟随列表滑动,滑动结束时自动停靠在顶部。 <android.support.v7.widget.Toolbar android:id="@+id/toolbar" android:layout_width="match_parent" android:layout_height="?attr/actionBarSize" app:layout_scrollFlags="scroll|enterAlways|snap"/> 4.在Activity或Fragment中,使用CoordinatorLayout.addOnOffsetChangedListener()方法监听滑动状态的变化,实现悬浮View的动态显示和隐藏。 AppBarLayout appBarLayout = findViewById(R.id.app_bar_layout); appBarLayout.addOnOffsetChangedListener(new AppBarLayout.OnOffsetChangedListener() { @Override public void onOffsetChanged(AppBarLayout appBarLayout, int verticalOffset) { if (Math.abs(verticalOffset) >= appBarLayout.getTotalScrollRange()) { //已经完全展开 toolbar.setVisibility(View.VISIBLE); } else { //还没有完全展开 toolbar.setVisibility(View.GONE); } } }); 通过以上四个步骤,就可以实现CoordinatorLayout顶效。需要注意的是,为了保证顶效的顺畅,请尽量避免在列表滑动时进行复杂的UI操作,以免导致界面掉帧和卡顿问题。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值