android behavior 自定义,Android应用开发之Android CoordinatorLayout高级用法之自定义Behavior...

本文将带你了解Android应用开发Android CoordinatorLayout高级用法之自定义Behavior,希望本文对大家学Android有所帮助。

上次简单的说了一下CoordinatorLayout的基本用法(android特性之CoordinatorLayout用法探析实例)。其中CoordinatorLayout给我们提供了一种新的事件的处理方式,Behavior。还记得那一串字符串吗?

app:layout_behavior="@string/appbar_scrolling_view_behavior"

其实它并不是一个字符串资源,而它代表的是一个类,就是一个Behavior,这玩意其实还可以自定义的。

首先,来让我见识一下它的真面目:

public static abstract class Behavior {

...

}

Behavior是CoordinatorLayout的一个内部泛型抽象类。内部类中指定的view类型规定了哪种类型的view的可以使用才Behavior。因此,如果没有特殊需求,直接指定view为View就行了。

1.某个view需要根据监听另一个的行为来控制自己的行为,这个时候我们需要重写2个方法:

public boolean layoutDependsOn(CoordinatorLayout parent, V child, View   dependency) {

return false;

}

public   boolean onDependentViewChanged(CoordinatorLayout   parent, V child, View dependency) {

return false;

}

2.我们的view需要根据监听CoordinatorLayout中的子view的滚动行为来改变自己的状态,现在我们就需要重写下面的方法了:

public   boolean onStartNestedScroll(CoordinatorLayout coordinatorLayout,

V child, View directTargetChild, View target,   int   nestedScrollAxes) {

return false;

}

public void   onNestedPreScroll(CoordinatorLayout   coordinatorLayout, V child, View target,

int dx, int dy, int[]   consumed) {

// Do nothing

}

下面我们先来看一下情况1,让一个view跟随另一个view的行为而实现状态的改变。我们定义一个Behavior,名字叫:FooterBehavior,代码如下:

package com.lingyun.coordinatorlayoutdemo;

import   android.content.Context;

import   android.support.design.widget.AppBarLayout;

import android.support.design.widget.CoordinatorLayout;

import   android.util.AttributeSet;

import   android.view.View;

/**

* Created by dandy on 2016/7/4.

*/

public class FooterBehavior extends CoordinatorLayout.Behavior{

public FooterBehavior(Context context,AttributeSet attributeSet){

super(context,attributeSet);

}

@Override

public boolean layoutDependsOn(CoordinatorLayout parent,   View child, View dependency) {

return dependency instanceof AppBarLayout;

}

@Override

public boolean   onDependentViewChanged(CoordinatorLayout parent, View child,   View dependency) {

float scaleY = Math.abs(dependency.getY()) /   dependency.getHeight();

child.setTranslationY(child.getHeight() *   scaleY);

return true;

}

}

我们在自定义的Behavior中,带有参数的这个构造必须要重载,因为在CoordinatorLayout里利用反射去获取这个Behavior的时候就是拿的这个构造。

在layoutDependsOn中,我们设置让View的状态来跟随AppBarLayout,也就是说只有AppBarLayout的状态发生变化才会影响到View。

接下来就是在onDependentViewChanged中对View做出相应的状态改变。在代码中,我们做的改变是,跟随dependedcy一起在Y轴方向移动,来达到显示和隐藏的目的。先布局如下:

activity_main.xml布局:

xmlns:android="http://schemas.android.com/apk/res/android"

android:layout_width="match_parent"

android:layout_height="match_parent">

appbar_main.xml布局如下:

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="wrap_content"

android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar">

android:id="@+id/toolbar"

android:layout_width="match_parent"

android:layout_height="?attr/actionBarSize"

app:popupTheme="@style/ThemeOverlay.AppCompat.Light"

android:background="?attr/colorPrimary"

app:layout_scrollFlags="scroll|enterAlways"/>

content_main.xml布局如下:

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"

app:layout_behavior="@string/appbar_scrolling_view_behavior">

android:layout_width="match_parent"

android:layout_height="match_parent"

android:gravity="center"

android:text="你是谁?你从哪里来?你到哪里去?"/>

footer_main.xml布局如下:

xmlns:app="http://schemas.android.com/apk/res-auto"

android:orientation="horizontal"

android:layout_width="match_parent"

android:layout_height="60dp"

android:layout_gravity="bottom"

android:background="?attr/colorPrimary"

app:layout_behavior="com.lingyun.coordinatorlayoutdemo.FooterBehavior">

android:layout_width="0dp"

android:layout_height="match_parent"

android:text="Tab1"

android:layout_weight="1"

android:gravity="center"

android:textColor="@android:color/white"/>

android:layout_width="0dp"

android:layout_height="match_parent"

android:text="Tab2"

本文由职坐标整理并发布,希望对同学们有所帮助。了解更多详情请关注职坐标移动开发之Android频道!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值