介绍

Interaction behavior plugin for child views of {@link CoordinatorLayout}.

A Behavior implements one or more interactions that a user can take on a child view.

These interactions may include drags, swipes, flings, or any other gestures.

@param < V > The View type that this Behavior operates on



交互行为主要用于CoordinatorLayout的子View。一个Behavior可以在一个字View上实现一个或者多个交互内容。这些交互可能包括拖拽,滑动,滚动或者是其他手势。

参数V代表这个Behavior可以操作的视图类型

类结构

初步实战

关注两个方面:

1、实现child view 监听另外一个child view的状态变化,例如大小、位置、显示状态等

关注layoutDependsOn和onDependentViewChanged方法。

2、实现child view监听CoordinatorLayout内NestedScrollingChild的接口实现类的滑动状态

关注onStartNestedScroll和onNestedPreScroll方法。如上一篇博文中提到的NestedScrollView,而不能使用普通的ScrollView

第一种情况,监听View的状态

位置跟随



布局文件

<?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:id="@+id/main_layout"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:fitsSystemWindows="true"
tools:context="mraz.com.coordinatorlayoutdemo.ScrollingActivity"> <TextView
android:id="@+id/depentent"
android:layout_width="100dp"
android:layout_height="100dp"
android:layout_gravity="top|left"
android:background="#73ff00"
android:gravity="center"
android:text="depentent"
android:textColor="@android:color/black" /> <TextView
android:layout_width="100dp"
android:layout_height="100dp"
android:layout_gravity="top|right"
android:background="#ffee00"
android:gravity="center"
android:text="auto"
android:textColor="@android:color/holo_red_dark"
app:layout_behavior="mraz.com.coordinatorlayoutdemo.FollowingBehavior" />
</android.support.design.widget.CoordinatorLayout>

Behavior

package mraz.com.coordinatorlayoutdemo;

import android.content.Context;
import android.support.design.widget.CoordinatorLayout;
import android.support.v4.view.ViewCompat;
import android.util.AttributeSet;
import android.view.View; /**
* Created by Mraz on 2016/8/15.
*/
public class FollowingBehavior extends CoordinatorLayout.Behavior<View> {
public FollowingBehavior(Context context, AttributeSet attrs) {
super(context, attrs);
} @Override
public boolean layoutDependsOn(CoordinatorLayout parent, View child, View dependency) {
return (dependency.getId() == R.id.depentent);//依赖左边的View
} @Override
public boolean onDependentViewChanged(CoordinatorLayout parent, View child, View dependency) {
int offsetX = dependency.getTop() - child.getTop();//拿到左边View和右边view的顶部差距
ViewCompat.offsetTopAndBottom(child, offsetX);//移动
return true;
}
}

实际效果


第二种情况,监听滚动状态

CoordinatorLayout实现NestedScrollingParent接口,

NestedScrollView实现NestedScrollingParent, NestedScrollingChild, ScrollingView接口

public class NestedScrollView extends FrameLayout implements NestedScrollingParent,
NestedScrollingChild, ScrollingView

说白了就是一个加强的ScrollView,但是实现的这几个接口是怎么回事呢?一个个的看下



NestedScrollingParent



Interface Meaning
onStartNestedScroll child执行startNestedScroll方法的时候会调用,返回true代表代表要和child联动
onNestedScrollAccepted onStartNestedScroll执行完成并返回true之后执行,用于做联动前的准备
onStopNestedScroll nested scroll结束后执行
onNestedScroll nested scroll进行中时执行,传递的参数是消耗了和没有消耗的滚动距离
onNestedPreScroll neseted scroll进行并且target没有消耗滚动时执行,nested scrolling执行dispatchNestedPreScroll后执行该方法
onNestedFling 请求一个滚动结束后的fling
onNestedPreFling target view没有消耗flinger之前执行
getNestedScrollAxes 返回NestedScrollingParent的滚动轴

NestedScrollingChild



Interface Meaning
setNestedScrollingEnabled 设置视图是否可以nested scrolling
isNestedScrollingEnabled 获取当前view是否可以nested scrolling
startNestedScroll 开始执行nested scroll,沿着给点的轴方向,返回true,代表找到了parent
stopNestedScroll 停止nested scroll
hasNestedScrollingParent 判断nested scrolling是否存在parent
dispatchNestedScroll 派发一个滚动给parent
dispatchNestedPreScroll 在没有消耗之前派发给parent,也就是parent有可能会在child之前消耗
dispatchNestedFling 派发fling给parent
dispatchNestedPreFling 消耗之前派发给parent

ScrollingView



Interface Meaning
computeHorizontalScrollRange 计算横向滚动的范围
computeHorizontalScrollOffset 计算横向偏移量
computeHorizontalScrollExtent 计算横向额外距离
computeVerticalScrollRange 滚动视图的可滚动范围是所有子元素的高度
computeVerticalScrollOffset 计算垂直方向滚动条的滑块的偏移。此值用来计算滚动条轨迹的滑块的位置
computeVerticalScrollExtent 计算纵向额外距离

关于NestedScrollingParent和NestedScrollingChild,存在两个Helper类









基本上方法和上面的比较类似,不赘述

看实例:

布局文件

<?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:id="@+id/main_layout"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:fitsSystemWindows="true"
android:scrollbars="vertical"
tools:context="mraz.com.coordinatorlayoutdemo.ScrollingActivity"> <android.support.v4.widget.NestedScrollView
android:layout_width="wrap_content"
android:layout_height="wrap_content"> <LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="vertical"> <TextView
android:layout_width="100dp"
android:layout_height="200dp"
android:layout_gravity="top|left"
android:background="#73ff00"
android:gravity="center"
android:text="depentent"
android:textColor="@android:color/black" /> <TextView
android:layout_width="100dp"
android:layout_height="200dp"
android:layout_gravity="top|left"
android:background="#73ff00"
android:gravity="center"
android:text="depentent"
android:textColor="@android:color/black" /> <TextView
android:layout_width="100dp"
android:layout_height="200dp"
android:layout_gravity="top|left"
android:background="#73ff00"
android:gravity="center"
android:text="depentent"
android:textColor="@android:color/black" /> <TextView
android:layout_width="100dp"
android:layout_height="200dp"
android:layout_gravity="top|left"
android:background="#73ff00"
android:gravity="center"
android:text="depentent"
android:textColor="@android:color/black" /> <TextView
android:layout_width="100dp"
android:layout_height="200dp"
android:layout_gravity="top|left"
android:background="#73ff00"
android:gravity="center"
android:text="depentent"
android:textColor="@android:color/black" /> <TextView
android:layout_width="100dp"
android:layout_height="200dp"
android:layout_gravity="top|left"
android:background="#73ff00"
android:gravity="center"
android:text="depentent"
android:textColor="@android:color/black" /> <TextView
android:layout_width="100dp"
android:layout_height="200dp"
android:layout_gravity="top|left"
android:background="#73ff00"
android:gravity="center"
android:text="depentent"
android:textColor="@android:color/black" /> <TextView
android:layout_width="100dp"
android:layout_height="200dp"
android:layout_gravity="top|left"
android:background="#73ff00"
android:gravity="center"
android:text="depentent"
android:textColor="@android:color/black" /> <TextView
android:layout_width="100dp"
android:layout_height="200dp"
android:layout_gravity="top|left"
android:background="#73ff00"
android:gravity="center"
android:text="depentent"
android:textColor="@android:color/black" />
</LinearLayout>
</android.support.v4.widget.NestedScrollView> <android.support.v4.widget.NestedScrollView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
app:layout_behavior="mraz.com.coordinatorlayoutdemo.MyScrollingBehavior"> <LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="vertical"> <TextView
android:layout_width="100dp"
android:layout_height="200dp"
android:layout_gravity="top|left"
android:background="#ff00aa"
android:gravity="center"
android:text="right"
android:textColor="@android:color/black" /> <TextView
android:layout_width="100dp"
android:layout_height="200dp"
android:layout_gravity="top|left"
android:background="#ff00aa"
android:gravity="center"
android:text="right"
android:textColor="@android:color/black" /> <TextView
android:layout_width="100dp"
android:layout_height="200dp"
android:layout_gravity="top|left"
android:background="#ff00aa"
android:gravity="center"
android:text="right"
android:textColor="@android:color/black" /> <TextView
android:layout_width="100dp"
android:layout_height="200dp"
android:layout_gravity="top|left"
android:background="#ff00aa"
android:gravity="center"
android:text="right"
android:textColor="@android:color/black" /> <TextView
android:layout_width="100dp"
android:layout_height="200dp"
android:layout_gravity="top|left"
android:background="#ff00aa"
android:gravity="center"
android:text="right"
android:textColor="@android:color/black" /> <TextView
android:layout_width="100dp"
android:layout_height="200dp"
android:layout_gravity="top|left"
android:background="#ff00aa"
android:gravity="center"
android:text="right"
android:textColor="@android:color/black" /> <TextView
android:layout_width="100dp"
android:layout_height="200dp"
android:layout_gravity="top|left"
android:background="#ff00aa"
android:gravity="center"
android:text="right"
android:textColor="@android:color/black" /> <TextView
android:layout_width="100dp"
android:layout_height="200dp"
android:layout_gravity="top|left"
android:background="#ff00aa"
android:gravity="center"
android:text="right"
android:textColor="@android:color/black" /> <TextView
android:layout_width="100dp"
android:layout_height="200dp"
android:layout_gravity="top|left"
android:background="#ff00aa"
android:gravity="center"
android:text="right"
android:textColor="@android:color/black" />
</LinearLayout>
</android.support.v4.widget.NestedScrollView> <android.support.v4.widget.NestedScrollView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="right"
app:layout_behavior="mraz.com.coordinatorlayoutdemo.MyScrollingBehavior"> <LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="vertical"> <TextView
android:layout_width="100dp"
android:layout_height="200dp"
android:layout_gravity="top|left"
android:background="#ffe600"
android:gravity="center"
android:text="right"
android:textColor="@android:color/black" /> <TextView
android:layout_width="100dp"
android:layout_height="200dp"
android:layout_gravity="top|left"
android:background="#ffe600"
android:gravity="center"
android:text="right"
android:textColor="@android:color/black" /> <TextView
android:layout_width="100dp"
android:layout_height="200dp"
android:layout_gravity="top|left"
android:background="#ffe600"
android:gravity="center"
android:text="right"
android:textColor="@android:color/black" /> <TextView
android:layout_width="100dp"
android:layout_height="200dp"
android:layout_gravity="top|left"
android:background="#ffe600"
android:gravity="center"
android:text="right"
android:textColor="@android:color/black" /> <TextView
android:layout_width="100dp"
android:layout_height="200dp"
android:layout_gravity="top|left"
android:background="#ffe600"
android:gravity="center"
android:text="right"
android:textColor="@android:color/black" /> <TextView
android:layout_width="100dp"
android:layout_height="200dp"
android:layout_gravity="top|left"
android:background="#ffe600"
android:gravity="center"
android:text="right"
android:textColor="@android:color/black" /> <TextView
android:layout_width="100dp"
android:layout_height="200dp"
android:layout_gravity="top|left"
android:background="#ffe600"
android:gravity="center"
android:text="right"
android:textColor="@android:color/black" /> <TextView
android:layout_width="100dp"
android:layout_height="200dp"
android:layout_gravity="top|left"
android:background="#ffe600"
android:gravity="center"
android:text="right"
android:textColor="@android:color/black" /> <TextView
android:layout_width="100dp"
android:layout_height="200dp"
android:layout_gravity="top|left"
android:background="#ffe600"
android:gravity="center"
android:text="right"
android:textColor="@android:color/black" />
</LinearLayout>
</android.support.v4.widget.NestedScrollView>
</android.support.design.widget.CoordinatorLayout>

3条杠杠~

Behavior

package mraz.com.coordinatorlayoutdemo;

import android.content.Context;
import android.support.design.widget.CoordinatorLayout;
import android.support.v4.view.ViewCompat;
import android.support.v4.widget.NestedScrollView;
import android.util.AttributeSet;
import android.view.View; public class MyScrollingBehavior extends CoordinatorLayout.Behavior {
public MyScrollingBehavior(Context context, AttributeSet attrs) {
super(context, attrs);
} @Override
public boolean onStartNestedScroll(CoordinatorLayout coordinatorLayout, View child, View directTargetChild, View target, int nestedScrollAxes) {
return (nestedScrollAxes & ViewCompat.SCROLL_AXIS_VERTICAL) != 0;//只对垂直滚动感兴趣
} @Override
public void onNestedPreScroll(CoordinatorLayout coordinatorLayout, View child, View target, int dx, int dy, int[] consumed) {
super.onNestedPreScroll(coordinatorLayout, child, target, dx, dy, consumed);
int leftScrolled = target.getScrollY();//获取左侧滚动距离
child.setScrollY(leftScrolled);//设置联动
} @Override
public boolean onNestedPreFling(CoordinatorLayout coordinatorLayout, View child, View target, float velocityX, float velocityY) {
((NestedScrollView) child).fling((int) velocityY);//松手后速度传递下去
return true;
}
}

实际效果


备注

参考博客:

http://blog.csdn.net/qibin0506/article/details/50290421

<Android 基础(二十)> CoordinatorLayout Behavior的更多相关文章

  1. Bootstrap <基础二十九>面板(Panels)

    Bootstrap 面板(Panels).面板组件用于把 DOM 组件插入到一个盒子中.创建一个基本的面板,只需要向 <div> 元素添加 class .panel 和 class .pa ...

  2. Bootstrap <基础二十八>列表组

    列表组.列表组件用于以列表形式呈现复杂的和自定义的内容.创建一个基本的列表组的步骤如下: 向元素 <ul> 添加 class .list-group. 向 <li> 添加 cl ...

  3. Bootstrap <基础二十六>进度条

    Bootstrap 进度条.在本教程中,你将看到如何使用 Bootstrap 创建加载.重定向或动作状态的进度条. Bootstrap 进度条使用 CSS3 过渡和动画来获得该效果.Internet ...

  4. Bootstrap <基础二十五>警告(Alerts)

    警告(Alerts)以及 Bootstrap 所提供的用于警告的 class.警告(Alerts)向用户提供了一种定义消息样式的方式.它们为典型的用户操作提供了上下文信息反馈. 您可以为警告框添加一个 ...

  5. Bootstrap<基础二十四> 缩略图

    Bootstrap 缩略图.大多数站点都需要在网格中布局图像.视频.文本等.Bootstrap 通过缩略图为此提供了一种简便的方式.使用 Bootstrap 创建缩略图的步骤如下: 在图像周围添加带有 ...

  6. Bootstrap <基础二十二>超大屏幕(Jumbotron)

    Bootstrap 支持的另一个特性,超大屏幕(Jumbotron).顾名思义该组件可以增加标题的大小,并为登陆页面内容添加更多的外边距(margin).使用超大屏幕(Jumbotron)的步骤如下: ...

  7. Bootstrap<基础二十> 标签

    Bootstrap 标签.标签可用于计数.提示或页面上其他的标记显示.使用 class .label 来显示标签,如下面的实例所示: <!DOCTYPE html> <html> ...

  8. shell基础二十篇 一些笔记

    shell基础二十篇 转自 http://bbs.chinaunix.net/thread-452942-1-1.html 研讨:Bash 内建命令 read (read命令更具体的说明见博客收藏的一 ...

  9. Android进阶(二十八)上下文菜单ContextMenu使用案例

    上下文菜单ContextMenu使用案例 前言 回顾之前的应用程序,发现之前创建的选项菜单无法显示了.按照正常逻辑来说,左图中在"商品信息"一栏中应该存在选项菜单,用户可进行分享等 ...

  10. Android进阶(二十)AndroidAPP开发问题汇总(四)

    · Android进阶(二十)AndroidAPP开发问题汇总(四) android:layout_width和android:width的区别 基中的android:layout_width和and ...

随机推荐

  1. 海思3519A上移植OpenCV3.x

    环境安装与准备 下载opencv3.4.1. 或者 下载opencv3.2.0. 进入到opencv所在的目录新建目录build,install 安装cmake: apt-get install cm ...

  2. 项目Alpha冲刺 6

    作业描述 课程: 软件工程1916|W(福州大学) 作业要求: 项目Alpha冲刺(团队) 团队名称: 火鸡堂 作业目标: 介绍第6天冲刺的项目进展.问题困难和心得体会 1.团队信息 队名:火鸡堂 队 ...

  3. 【医学影像】《Dermatologist-level classification of skin cancer with deep neural networks》论文笔记

    这是一篇关于皮肤癌分类的文章,核心就是分类器,由斯坦福大学团队发表,居然发到了nature上,让我惊讶又佩服,虽然在方法上没什么大的创新,但是论文本身的工作却意义重大,并且这篇17年见刊的文章,引用量 ...

  4. [SCOI2018]游泳池(计算几何+分数规划+最大权闭合子图)

    题目链接 https://www.luogu.org/problemnew/show/U56187 注:题面参考了网上的其他博客,并非原题题面,因此数据范围可能有误.数据为原创数据. 题解 其实就是许 ...

  5. 6. Javscript学习笔记——BOM

    6. BOM 6.1 widow对象 全局作用域: window是浏览器的一个实例 window对象同时扮演着ECMAScript中的Global对象的角色,因此所有在全局作用域中声明的变量.函数都会 ...

  6. redis的持久化相关操纵

    一.redis数据持久化(数据保存在硬盘上) 1. 关系型数据库Mmysql持久化 任何增删改语句都是在硬盘上操作(安全) 断电,硬盘上数据还在 2.非关系型数据库 默认所有的增删改都是在内存中操作( ...

  7. Pytorch学习笔记(一)——简介

    一.Tensor Tensor是Pytorch中重要的数据结构,可以认为是一个高维数组.Tensor可以是一个标量.一维数组(向量).二维数组(矩阵)或者高维数组等.Tensor和numpy的ndar ...

  8. vue 无限级分类导航

    递归组件,实现无限级分类导航 https://cn.vuejs.org/v2/guide/components-edge-cases.html#%E9%80%92%E5%BD%92%E7%BB%84% ...

  9. oracle--dump->buffer cache (dump 深入实践一)

    1,dump 取值 ALTER SESSION SET EVENTS 'immediate trace name buffers level n'; 只转储buffer header. 在level ...

  10. unity 渲染第二步

    先不要用 unity shader 提供给你的转换矩阵,看看屏幕上的图形,你会学到更多. --- <unity 渲染箴言> 假设你 create 了一个 cube,放在默认的位置,默认的 ...