热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

sidhu眼中的CoordinatorLayout.Behavior(三)

前言看过前两篇文章的同学sidhu眼中的CoordinatorLayout.Behavior(一)sidhu眼中的CoordinatorLayout.B

前言

看过前两篇文章的同学
sidhu眼中的CoordinatorLayout.Behavior(一)
sidhu眼中的CoordinatorLayout.Behavior(二)
应该知道今天要讲的内容了——Behavior的布局依赖
其实这个内容挺少的,我都想直接贴代码然大家自己体会了……额,开玩笑的,不过内容真的少,我也不浪费大家时间了,疑问我不提了,直入主题

主题

(有木有直入主题,哈哈~)
我将上次的例子做了下修改
xml:



相比于之前的布局我们可以看到,就多了一个小方块在布局里面,至于我想实现的效果可以看下面效果图

让小方块可以随着上面的head做同步的位移
就如我上篇所说的,使用原理还是实现NestedScrollingChild接口,废话不多说,上代码(没错,我就是这样的人,一言不合就上代码)

package com.mintmedical.mybehaviordemo;import android.animation.ValueAnimator;
import android.content.Context;
import android.support.design.widget.CoordinatorLayout;
import android.support.v4.view.NestedScrollingChild;
import android.support.v4.view.NestedScrollingChildHelper;
import android.util.AttributeSet;
import android.view.View;/*** Created by SidHu on 2016/8/17.*/
public class HideHeadBehavior extends CoordinatorLayout.Behavior implements NestedScrollingChild {private boolean isHeadHide &#61; false;private boolean isAnimating &#61; false;private final int SCROOL_VALUE &#61; 50;private int childHeight;private final int animationDuration &#61; 500;private NestedScrollingChildHelper childHelper;public HideHeadBehavior(Context context, AttributeSet attrs) {super(context, attrs);}&#64;Overridepublic boolean onStartNestedScroll(CoordinatorLayout coordinatorLayout, View child, View directTargetChild, View target, int nestedScrollAxes) {if (target.getId() &#61;&#61; R.id.rel_body) {if (childHeight &#61;&#61; 0) {childHeight &#61; child.getHeight();}if (childHelper &#61;&#61; null) {childHelper &#61; new NestedScrollingChildHelper(child);}return true;} else {return false;}}&#64;Overridepublic void onNestedPreScroll(CoordinatorLayout coordinatorLayout, View child, View target, int dx, int dy, int[] consumed) {super.onNestedPreScroll(coordinatorLayout, child, target, dx, dy, consumed);if (isAnimating) {return;}if (dy > SCROOL_VALUE && !isHeadHide) {hide(child, target);} else if (dy <-SCROOL_VALUE && isHeadHide) {show(child, target);}}public void hide(final View child, final View target) {isHeadHide &#61; true;ValueAnimator valueAnimator &#61; new ValueAnimator();valueAnimator.setIntValues(0, childHeight);valueAnimator.setDuration(animationDuration);valueAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {&#64;Overridepublic void onAnimationUpdate(ValueAnimator animation) {if (child.getBottom() > 0) {int value &#61; (int) animation.getAnimatedValue();isAnimating &#61; value !&#61; childHeight;child.layout(child.getLeft(), -value, child.getRight(), -value &#43; childHeight);target.layout(target.getLeft(), -value &#43; childHeight, target.getRight(), target.getBottom());}}});valueAnimator.start();}public void show(final View child, final View target) {isHeadHide &#61; false;ValueAnimator valueAnimator &#61; new ValueAnimator();valueAnimator.setIntValues(0, childHeight);valueAnimator.setDuration(animationDuration);valueAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {&#64;Overridepublic void onAnimationUpdate(ValueAnimator animation) {if (child.getBottom() }

我将head实现了NestedScrollingChild接口&#xff0c;然后就没有做其他事情了。&#xff08;这也说明了&#xff0c;想让控件通知CoordinatorLayout自己的状态其实只要实现了NestedScrollingChild接口就够了&#xff0c;假如你不需要关心滑动手势&#xff0c;就像小方块只关心head的位移一样&#xff0c;那你startNestedScroll之类的这样方法都不用要了&#xff09;

那我们看一下小方块的Behavior

package com.mintmedical.mybehaviordemo;import android.content.Context;
import android.support.design.widget.CoordinatorLayout;
import android.util.AttributeSet;
import android.view.View;/*** Created by SidHu on 2016/8/18.*/
public class MoveWithHeadBehavior extends CoordinatorLayout.Behavior{private int lastBottom &#61; -1;public MoveWithHeadBehavior(Context context, AttributeSet attrs) {super(context, attrs);}&#64;Overridepublic boolean layoutDependsOn(CoordinatorLayout parent, View child, View dependency) {return dependency.getId() &#61;&#61; R.id.rel_head;}&#64;Overridepublic boolean onDependentViewChanged(CoordinatorLayout parent, View child, View dependency) {if (lastBottom &#61;&#61; -1) {lastBottom &#61; dependency.getBottom();}if (dependency.getBottom() !&#61; lastBottom) {int d &#61; dependency.getBottom()-lastBottom;lastBottom &#61; dependency.getBottom();child.offsetTopAndBottom(d);}return super.onDependentViewChanged(parent, child, dependency);}
}

代码也是非~非~非~非常简单&#xff0c;布局依赖最主要的关系这两个方法&#xff0c;一个是判断是不是自己关心的target View&#xff08;跟滑动的时候简直一毛一样&#xff09;&#xff0c;一个是被关心的target View变化以后的回调&#xff0c;代码我就不解释啦&#xff0c;也是很简单&#xff08;大家有什么问题可以在评论里面问我啊&#xff09;。

好了&#xff0c;关于Behavior的使用我就先介绍到这了
![图片上传中...]

如果觉得这篇文章对你有帮助&#xff0c;点个赞鼓励一下吧、、(●&#39;◡&#39;●)




推荐阅读
  • 四、连接屏幕流各位读者好!我们已经到了应用开发的一个重要阶段——连接屏幕。如您所知,我们在上一章 ... [详细]
  • Android开发实现的计时器功能示例
    本文分享了Android开发实现的计时器功能示例,包括效果图、布局和按钮的使用。通过使用Chronometer控件,可以实现计时器功能。该示例适用于Android平台,供开发者参考。 ... [详细]
  • SmartRefreshLayout自定义头部刷新和底部加载
    1.添加依赖implementation‘com.scwang.smartrefresh:SmartRefreshLayout:1.0.3’implementation‘com.s ... [详细]
  • 在一对一直播源码使用过程中,有时会出现软键盘切换闪屏问题,就是当切换表情的时候屏幕会跳动,因此要对一对一直播源码表情面板无缝切换进行优化。 ... [详细]
  • 涉及的知识点-ViewGroup的测量与布局-View的测量与布局-滑动冲突的处理-VelocityTracker滑动速率跟踪-Scroller实现弹性滑动-屏幕宽高的获取等实现步 ... [详细]
  • 这两天用到了ListView,写下遇到的一些问题。首先是ListView本身与子控件的焦点问题,比如我这里子控件用到了Button,在需要ListView中的根布局属性上加上下面的这一个属性:and ... [详细]
  • 在最近的一系列文章,对midipadAPP,有一个关于一个radialgradiant渲染每个padview利用的探讨,对审美的原因&#x ... [详细]
  • http:my.oschina.netleejun2005blog136820刚看到群里又有同学在说HTTP协议下的Get请求参数长度是有大小限制的,最大不能超过XX ... [详细]
  • 成功安装Sabayon Linux在thinkpad X60上的经验分享
    本文分享了作者在国庆期间在thinkpad X60上成功安装Sabayon Linux的经验。通过修改CHOST和执行emerge命令,作者顺利完成了安装过程。Sabayon Linux是一个基于Gentoo Linux的发行版,可以将电脑快速转变为一个功能强大的系统。除了作为一个live DVD使用外,Sabayon Linux还可以被安装在硬盘上,方便用户使用。 ... [详细]
  • MyBatis多表查询与动态SQL使用
    本文介绍了MyBatis多表查询与动态SQL的使用方法,包括一对一查询和一对多查询。同时还介绍了动态SQL的使用,包括if标签、trim标签、where标签、set标签和foreach标签的用法。文章还提供了相关的配置信息和示例代码。 ... [详细]
  • iOS超签签名服务器搭建及其优劣势
    本文介绍了搭建iOS超签签名服务器的原因和优势,包括不掉签、用户可以直接安装不需要信任、体验好等。同时也提到了超签的劣势,即一个证书只能安装100个,成本较高。文章还详细介绍了超签的实现原理,包括用户请求服务器安装mobileconfig文件、服务器调用苹果接口添加udid等步骤。最后,还提到了生成mobileconfig文件和导出AppleWorldwideDeveloperRelationsCertificationAuthority证书的方法。 ... [详细]
  • 基于Socket的多个客户端之间的聊天功能实现方法
    本文介绍了基于Socket的多个客户端之间实现聊天功能的方法,包括服务器端的实现和客户端的实现。服务器端通过每个用户的输出流向特定用户发送消息,而客户端通过输入流接收消息。同时,还介绍了相关的实体类和Socket的基本概念。 ... [详细]
  • 注:根据Qt小神童的视频教程改编概论:利用最新的Qt5.1.1在windows下开发的一个小的时钟程序,有指针与表盘。1.Qtforwindows开发环境最新的Qt已经集 ... [详细]
  • 当我在doWork方法中运行代码时,通过单击button1,进度条按预期工作.但是,当我从其他方法(即btn2,btn3)将列表传递给doWork方法时,进度条在启动后会跳转到10 ... [详细]
  • java.lang.Class.getDeclaredMethod()方法java.lang.Class.getDeclaredMethod()方法用法实例教程-方法返回一个Met ... [详细]
author-avatar
捕风的默小墨
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有