JS技术

CoordinatorLayout高级用法-自定义Behavior - Loaders Blog - 博客频道 - CS

字号+ 作者:H5之家 来源:H5之家 2015-12-14 18:01 我要评论( )

先把代码贴出来吧: String cc = 立足农村,传播科技、提升价值,等待您的入住http://t.cn/SXiTPi;Pattern pattern = Pattern.compile([http]{4}\\:\\/\\/[a-z]*

在新的support design中,CoordinatorLayout可以说是最重要的一个控件了,CoordinatorLayout给我们带来了一种新的事件的处理方式——behavior,你是不是还记得我们在使用CoordinatorLayout的时候,一些子view需要一段,

app:layout_behavior="@string/appbar_scrolling_view_behavior"

这样的xml配置?当时我们不知道这是干嘛的,直接照用就行了,后来发现这玩意是一个类!而且我们还可以自定义!所以,今天这篇博客我们首先来学习一下如何自定义Behavior,之后的博客可能会看一下CoordinatorLayout是怎么处理这个Behavior的。

认识Behavior

Behavior是CoordinatorLayout的一个抽象内部类

<> { public Behavior() { } public Behavior(Context context, AttributeSet attrs) { } ... }

有一个泛型是指定的我们应用这个Behavior的View的类型,例如上面的appbar_scrolling_view_behavior对应的字符串其实是android.support.design.widget.AppBarLayout$ScrollingViewBehavior,这个ScrollingViewBehavior内部类指定的泛型是View,所以理论上这个Behavior我们任何的View都可以使用,我们在自定义的时候,如果不是特殊的行为,也可以直接指定泛型View。

在自定义Behavior的时候,我们需要关心的两组四个方法,为什么分为两组呢?看一下下面两种情况

  • 某个view监听另一个view的状态变化,例如大小、位置、显示状态等
  • 某个view监听CoordinatorLayout里的滑动状态
  • 对于第一种情况,我们关心的是:
    layoutDependsOn和onDependentViewChanged方法,
    对于第二种情况,我们关心的是:
    onStartNestedScroll和onNestedPreScroll方法。
    对于这几个方法什么意思,我们需要干什么,稍候我们就能了解到。

    初步自定义

    现在我们就来根据第一种情况尝试自定义一个Behavior,这里我们实现一个简单的效果,让一个View根据另一个View上下移动。
    首先我们来自定义一个Behavior,起名为DependentBehavior

    .(Context context, AttributeSet attrs) { super(context, attrs); } (CoordinatorLayout parent, View child, View dependency) { return super.layoutDependsOn(parent, child, dependency); } (CoordinatorLayout parent, View child, View dependency) { ViewCompat.offsetLeftAndRight(); return super.onDependentViewChanged(parent, child, dependency); } }

    注意一下,带有参数的这个构造必须要重载,因为在CoordinatorLayout里利用反射去获取这个Behavior的时候就是拿的这个构造。我们覆写了两个方法layoutDependsOn和onDependentViewChanged,这两个方法的参数都是一样的,解释一下,第一个不用说,就是当前的CoordinatorLayout,第二个参数是我们设置这个Behavior的View,第三个是我们关心的那个View。如何知道关心的哪个呢?layoutDependsOn的返回值决定了一切!

    这里我们关心一个TextView好了,所以layoutDependsOn可以这么写,

    (CoordinatorLayout parent, View child, View dependency) { return dependency instanceof TextView; }

    现在设置好了关心谁,接下来就是在这个View状态发生变化的时候,我们现在的View该做些什么了,恩,这里肯定是在onDependentViewChanged做工作了。我们的任务就是获取dependency距离底部的距离,并且设置给child,很简单。

    (CoordinatorLayout parent, View child, View dependency) { int offset = dependency.getTop() - child.getTop(); ViewCompat.offsetTopAndBottom(child, offset); return true; }

    首先我们先获取两个View的top值的差,然后让child的位置位移一下就ok啦,如此简单,那这个简单的Behavior如何用呢?

    <android.support.design.widget.CoordinatorLayout ==="org.loader.mybehavior.MainActivity"> <TextView ==="top|left" android:text="depentent"/> <TextView ===>

    注意,第二个TextView我们设置了app:layout_behavior="org.loader.mybehavior.DependentBehavior"
    值正好是我们定义的那个DependentBehavior。

    final TextView depentent = (TextView) findViewById(R.id.depentent); depentent.setOnClickListener(new View.OnClickListener() { (View v) { ViewCompat.offsetTopAndBottom(v, 5); } });

    在Activity中,我们每次点击第一个TextView都会去改变一下它的位置,下面让我们来看看另一个TextView的位置改变了没有。

    Scroll Behavior

    在学会了如何自定义Behavior后,我们接着来实现上面说的第二种情况-滑动。为了演示这种Behavior的定义,我们还是来做个无用功,让一个ScrollView跟随另一个ScrollView滑动。恩,先来看看效果吧,

    从效果中我们可以看出,第二个ScrollView明显是是在跟随第一个进行滑动,现在就让我们用自定义Behavior的形式实现它。
    创建一个Behavior,起名叫ScrollBehavior,

    .(Context context, AttributeSet attrs) { super(context, attrs); } (CoordinatorLayout coordinatorLayout, View child, View directTargetChild, View target, int nestedScrollAxes) { return super.onStartNestedScroll(coordinatorLayout, child, directTargetChild, target, nestedScrollAxes); } (CoordinatorLayout coordinatorLayout, View child, View target, int dx, int dy, int[] consumed) { super.onNestedPreScroll(coordinatorLayout, child, target, dx, dy, consumed); } (CoordinatorLayout coordinatorLayout, View child, View target, float velocityX, float velocityY) { return super.onNestedPreFling(coordinatorLayout, child, target, velocityX, velocityY); } }

     

    1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。

    相关文章
    • Android:interpolator用法 - zcljy0318的专栏 - 博客频道 - CSDN.NET zclj

      Android:interpolator用法 - zcljy0318的专栏 - 博客频道 - CSDN.NET

      2015-12-14 16:02

    • JScript中正则表达式用法详解(附例子:JScript做语法加亮显示) _javascript教程教程

      JScript中正则表达式用法详解(附例子:JScript做语法加亮显示) _java

      2015-10-08 13:13

    • 总结showModalDialog和showModelessDialog用法_javascript教程教程

      总结showModalDialog和showModelessDialog用法_javascript教程教程

      2015-10-07 15:24

    • 一组常用的弹出窗口用法总结_javascript教程教程

      一组常用的弹出窗口用法总结_javascript教程教程

      2015-10-07 10:08

    网友点评
    p