Android Behavior详解

Behavior是Android Design库中用于CoordinatorLayout的组件,它允许非侵入式地添加动态布局依赖和处理滑动手势。本文介绍了如何通过自定义Behavior实现View之间的交互,包括监听另一个View的状态变化和NestedScrollingChild的滑动状态。详细讲解了layoutDependsOn、onDependentViewChanged、onStartNestedScroll等关键方法的用途,并提供了XML中使用Behavior的示例。
摘要由CSDN通过智能技术生成

Behavior是Android新出的Design库里新增的布局概念。Behavior只有是CoordinatorLayout的直接子View才有意义。可以为任何View添加一个Behavior。
Behavior是一系列回调。让你有机会以非侵入的为View添加动态的依赖布局,和处理父布局(CoordinatorLayout)滑动手势的机会。如果我们想实现控件之间任意的交互效果,完全可以通过自定义 Behavior 的方式达到。

Behavior是CoordinatorLayout的一个抽象内部类

public abstract static class Behavior<V extends View> {
   
      public Behavior() {
      }

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

1,官方BottomSheetBehavior使用

        app:behavior_hideable="true"
        app:behavior_peekHeight="0dp"
        app:layout_behavior="@string/bottom_sheet_behavior">

public void onCl(View view) {
        BottomSheetBehavior behavior = BottomSheetBehavior.from(findViewById(R.id.scroll));
        if(behavior.getState() == BottomSheetBehavior.STATE_EXPANDED) {
            behavior.setState(BottomSheetBehavior.STATE_COLLAPSED);
        }else {
            behavior.setState(BottomSheetBehavior.STATE_EXPANDED);
        }
    }
   // BottomSheetDialog 
   /* BottomSheetDialog sheetDialog = new BottomSheetDialog();
      sheetDialog.setContentView(view);
      sheetDialog.show();*/
   //setBottomSheetCallback
 /*   behavior.setBottomSheetCallback(new BottomSheetBehavior.BottomSheetCallback() {
        @Override
        public void onStateChanged(@NonNull View bottomSheet, int newState) {

        }

        @Override
        public void onSlide(@NonNull View bottomSheet, float slideOffset) {

        }
    });*/

2,自定义Behavior
我们可以按照两种目的来实现自己的Behavior,当然也可以两种都实现啦

某个view监听另一个view的状态变化,例如大小、位置、显示状态等

某个view监听CoordinatorLayout内的NestedScrollingChild的接口实现类的滑动状态

第一种情况需要重写layoutDependsOn和onDependentViewChanged方法

第二种情况需要重写onStartNestedScroll和onNestedPreScroll系列方法

如果你的自定义View默认使用一个Behavior。
在你的自定义View类上添加@DefaultBehavior(你的Behavior.class)这句注解。
你的View就默认使用这个Behavior。就像AppBarLayout一样。

@DefaultBehavior(AppBarLayout.Behavior.class)
public class AppBarLayout extends LinearLayout {
   }

第一种情况
这里写图片描述
现在我们就来根据第一种情况尝试自定义一个Behavior,这里我们实现一个简单的效果,让一个View根据另一个View上下移动。

public class DependencyBehavior extends CoordinatorLayout.Behavior<View> {
   

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

    @Override
    public boolean layoutDependsOn(CoordinatorLayout parent, View child, View dependency) {
        return dependency instanceof Button;
    }

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

我们覆写了两个方法layoutDependsOn和onDependentViewChanged,这两个方法的参数都是一样的,解释一下,第一个不用说,就是当前的CoordinatorLayout,第二个参数是我们设置这个Behavior的View,第三个是我们关心的那个View。如何知道关心的哪个呢?layoutDependsOn的返回值决定了一切!

return dependency instanceof Button; 关心所有Button的变化。
return dependency.getId()==R.id.Btn; 关心id为R.id.Btn的变化。

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

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

在XM

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值