前言
看过前两篇文章的同学
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的使用我就先介绍到这了
![图片上传中...]