Android开发之自定义Behavior

本文通过两个实例介绍了如何在Android中自定义Behavior,实现视图间的联动效果。包括如何监听特定视图的变化并做出响应,以及如何同步滚动视图。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

连续讲了几章关于CoordinationLayout的用法,以及Google给我们提供了两个非常强大的Behavior,以及我们自己实现了一个较为简单的Behavior,今天我带领大家通过实现两个简单的效果来讲解一下Behavior,以及实现我们自定义Behavior的效果。

---------------------------分割线---------------------------

如果不熟悉CoordinationLayout的用法,请看我的另外几篇博客:

基本用法:《Android开发之初识CoordinatorLayout》 

进阶案列:《Android开发之实现滑动RecyclerView,浮动按钮的显示和隐藏(二)

案例:《Android开发之给TabLayout加上能消失的ToolBar

案列:《Android开发之CollapsingToolbarLayout的用法

---------------------------分割线---------------------------

自定义Behavior:继承CoordinatorLayout.Behavior重写里面几个关键的方法。

一:boolean layoutDependsOn(CoordinatorLayout parent, View child,View dependency):

1.用来决定需要监听哪些控件或者容器的状态(1.知道监听谁;2.什么状态改变)。

2.CoordinatorLayout parent :父容器

3.View child:子控件(需要监听dependency这个view的视图们,也可称为观察者)

4.View dependency:你要监听的那个View


二:onDependentViewChanged(CoordinatorLayout parent, View child,View dependency)

1.当被监听的view发生改变的时候回调。

2.可以在此方法里面做一些响应的联动动画等效果。

---------------------------分割线---------------------------

ok我们来看第一个小案例:


下面贴出代码:

import android.animation.ObjectAnimator;
import android.content.Context;
import android.support.design.widget.CoordinatorLayout;
import android.support.v4.view.ViewCompat;
import android.util.AttributeSet;
import android.view.View;
import android.widget.TextView;

/**
 * Created by Fly on 2017/5/13.
 */

public class CustomBehavior extends CoordinatorLayout.Behavior<View> {

    public CustomBehavior(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    @Override
    public boolean layoutDependsOn(CoordinatorLayout parent, View child,
                                   View dependency) {
        //可以根据ID或者TAG来判断
        return dependency instanceof TextView || super.layoutDependsOn(parent, child, dependency);
    }

    @Override
    public boolean onDependentViewChanged(CoordinatorLayout parent, View child,
                                          View dependency) {
        //获取被监听的view的状态---垂直方向位置
        int offset = dependency.getTop() - child.getTop();
        //让child进行平移
        ViewCompat.offsetTopAndBottom(child, offset);
        ObjectAnimator oa = ObjectAnimator.ofFloat(child, "rotationX", 0f, 360f);
        oa.setDuration(500);
        oa.start();
        return true;
    }
}

布局:

 <TextView
        android:layout_width="80dp"
        android:layout_height="80dp"
        android:layout_gravity="right|top"
        android:background="#5c3535"
        android:text="观察者"
        app:layout_behavior="com.fly.lsn19_custombehavior.CustomBehavior" />
---------------------------分割线---------------------------
第二个小案例:


代码奉上:

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;

/**
 * Created by Fly on 2017/5/13.
 */

public class SyncScrollBehavior extends CoordinatorLayout.Behavior<View> {

    public SyncScrollBehavior(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) || super.onStartNestedScroll(coordinatorLayout, child, directTargetChild, target, nestedScrollAxes);
    }

    @Override
    public void onNestedPreScroll(CoordinatorLayout coordinatorLayout, View child, View target, int dx, int dy, int[] consumed) {
        int scrollY = target.getScrollY();
        child.setScrollY(scrollY);
        super.onNestedPreScroll(coordinatorLayout, child, target, dx, dy, consumed);
    }

    @Override
    public boolean onNestedFling(CoordinatorLayout coordinatorLayout, View child, View target, float velocityX, float velocityY, boolean consumed) {
        //快速滑动的惯性移动(松开手指后还会有滑动的效果)
        ((NestedScrollView) child).fling((int) velocityY);
        return super.onNestedFling(coordinatorLayout, child, target, velocityX, velocityY, consumed);
    }
}
--------------------------- 希望两个小案列能够帮助大家更好的理解---------------------------

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

等待着冬天的风

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值