一.简介
Behavior的中文翻译是”行为”的意思.
Behavior是Android新出的Design库里新增的布局概念。Behavior只有是CoordinatorLayout的直接子View才有意义。可以为任何View添加一个Behavior。
Material Design里面的CoordinatorLayout是一个非常强大的控件,它接管了child组件之间的交互。让你滑动交互使用更加方便简单,效果也更加强大,不需要像以前那样自己处理一坨什么乱七八槽的滑动,事件传递之类的处理了。
Behavior是一系列回调。让你有机会以非侵入的为View添加动态的依赖布局,和处理父布局(CoordinatorLayout)滑动手势的机会。如果我们想实现控件之间任意的交互效果,完全可以通过自定义 Behavior 的方式达到。
在学习自定义behavior之前我们先看一看官方内置的behavior
二.BottomSheetBehavior
BottomSheetBehavior实现的效果就是一个布局底部弹出,类似于饿了么查看购物车的效果,这种效果我们可以有很多种方式实现,使用BottomSheetBehavior你会发现简直只需要一行代码.
1.页面布局
<?xml version="1.0" encoding="utf-8"?><android.support.design.widget.CoordinatorLayout xmlns:android="/apk/res/android"xmlns:app="/apk/res-auto"xmlns:tools="/tools"android:id="@+id/activity_group_car_boottom_sheet"android:layout_width="match_parent"android:layout_height="match_parent"tools:context="com.testdemo.king.kingtestdemo.GroupCarBoottomSheetActivity"><LinearLayout android:visibility="visible"android:orientation="horizontal"android:layout_width="match_parent"android:layout_height="match_parent"><Button android:id="@+id/bt1"android:text="显示bottomsheetBehavior"android:layout_width="0dp"android:layout_weight="1"android:layout_height="wrap_content" /><Button android:id="@+id/bt2"android:text="显示bottomsheetBehaviorDialog"android:layout_width="0dp"android:layout_weight="1"android:layout_height="wrap_content" /></LinearLayout><RelativeLayout android:id="@+id/design_bottom_sheet"android:layout_width="match_parent"android:layout_gravity="center"android:layout_height="match_parent"android:background="@color/colorAccent"app:behavior_hideable="true"app:behavior_peekHeight="100dp"app:elevation="4dp"app:layout_behavior="@string/bottom_sheet_behavior"><TextView android:id="@+id/bottomsheet_text"android:layout_width="wrap_content"android:layout_height="match_parent"android:text="展示Bottom Sheets"android:textColor="#FFFFFF" /></RelativeLayout></android.support.design.widget.CoordinatorLayout>
属性说明
//折叠的高度app:behavior_peekHeight="10dp"setPeekHeight//是否可以隐藏app:behavior_hideable="true" setHideable//是否跳过折叠状态app:behavior_skipCollapsed="true" setSkipCollapsed
2.代码实现
只需要获取到这个behavior
bottomSheetBehavior = BottomSheetBehavior.from((View)rlBottom);
然后点击的时候按钮时候控制其隐藏和出现即可
case R.id.bt1:if (bottomSheetBehavior.getState() == BottomSheetBehavior.STATE_COLLAPSED) {bottomSheetBehavior.setState(BottomSheetBehavior.STATE_HIDDEN);} else {bottomSheetBehavior.setState(BottomSheetBehavior.STATE_COLLAPSED);}break;
状态说明:
STATE_COLLAPSED: 关闭Bottom Sheets,显示peekHeight的高度,默认是0STATE_DRAGGING: 用户拖拽Bottom Sheets时的状态STATE_SETTLING: 当Bottom Sheets view释放时记录的状态。STATE_EXPANDED: 当Bottom Sheets 展开的状态STATE_HIDDEN: 当Bottom Sheets 隐藏的状态
3.状态监听
我们可以通过监听状态的改变做一些自定义的操作,比如这样.
bottomSheetBehavior.setBottomSheetCallback(new BottomSheetBehavior.BottomSheetCallback() {@Overridepublic void onStateChanged(@NonNull View bottomSheet, int newState) {///这里是bottomSheet 状态的改变,根据slideOffset可以做一些动画}@Overridepublic void onSlide(@NonNull View bottomSheet, float slideOffset) {//这里是拖拽中的回调,根据slideOffset可以做一些动画Log.e("king",slideOffset+"");if(slideOffset>0){if(slideOffset>0.5)slideOffset=0.5f;ViewGroup.LayoutParams para1;para1 = bottomSheet.getLayoutParams();para1.width = (int) (rlBottomWidth*(0.5+slideOffset));bottomSheet.setLayoutParams(para1);}}});
三.BottomSheetDialog
BottomSheetDialog是一个基于bottomSheetbehavior实现的dialog
代码实现
private void initBottomSheetDialog() {dialog = new BottomSheetDialog(this);View dialogView = LayoutInflater.from(this).inflate(R.layout.item_text, null, false);((TextView) dialogView.findViewById(R.id.text)).setText("bottomsheetDialog");dialog.setContentView(dialogView);dialog.hide();}
然后只需要调用dialog.hide();或者show()方法就能实现dialog的显示隐藏了.
当然,BottomSheetDialog也能调用状态监听,具体实现如下
private void setBehaviorCallback() {View view = dialog.getDelegate().findViewById(android.support.design.R.id.design_bottom_sheet);final BottomSheetBehavior bottomSheetBehavior = BottomSheetBehavior.from(view);bottomSheetBehavior.setBottomSheetCallback(new BottomSheetBehavior.BottomSheetCallback() {@Overridepublic void onStateChanged(@NonNull View bottomSheet, int newState) {if (newState == BottomSheetBehavior.STATE_HIDDEN) {dialog.dismiss();bottomSheetBehavior.setState(BottomSheetBehavior.STATE_COLLAPSED);}}@Overridepublic void onSlide(@NonNull View bottomSheet, float slideOffset) {}});}
四.SwipeDismissBehavior
SwipeDismissBehavior是一个实现侧滑删除的效果,比较简单
private void initSwipeDismissBehavior() {SwipeDismissBehavior<View> swipe = new SwipeDismissBehavior();swipe.setSwipeDirection(SwipeDismissBehavior.SWIPE_DIRECTION_ANY);swipe.setListener(new SwipeDismissBehavior.OnDismissListener() {@Overridepublic void onDismiss(View view) {}@Overridepublic void onDragStateChanged(int state) {}});CoordinatorLayout.LayoutParams coordinatorParams =(CoordinatorLayout.LayoutParams)tv1 .getLayoutParams();coordinatorParams.setBehavior(swipe);}
五.AppBarLayout$ScrollingViewBehavior
ScrollingViewBehavior的简单应用大家参考一下这篇文章吧
/aqi00/article/details/56834285
系统默认提供的behavior毕竟只能实现一部分功能,下一篇博客我们将介绍如何使用自定义behavior来实现复杂的功能.