一.简介
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="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/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的高度,默认是0
- STATE_DRAGGING: 用户拖拽Bottom Sheets时的状态
- STATE_SETTLING: 当Bottom Sheets view释放时记录的状态。
- STATE_EXPANDED: 当Bottom Sheets 展开的状态
- STATE_HIDDEN: 当Bottom Sheets 隐藏的状态
3.状态监听
我们可以通过监听状态的改变做一些自定义的操作,比如这样.
bottomSheetBehavior.setBottomSheetCallback(new BottomSheetBehavior.BottomSheetCallback() {
@Override
public void onStateChanged(@NonNull View bottomSheet, int newState) {
// /这里是bottomSheet 状态的改变,根据slideOffset可以做一些动画
}
@Override
public 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() {
@Override
public void onStateChanged(@NonNull View bottomSheet, int newState) {
if (newState == BottomSheetBehavior.STATE_HIDDEN) {
dialog.dismiss();
bottomSheetBehavior.setState(BottomSheetBehavior.STATE_COLLAPSED);
}
}
@Override
public 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() {
@Override
public void onDismiss(View view) {
}
@Override
public void onDragStateChanged(int state) {
}
});
CoordinatorLayout.LayoutParams coordinatorParams =
(CoordinatorLayout.LayoutParams)tv1 .getLayoutParams();
coordinatorParams.setBehavior(swipe);
}
五.AppBarLayout$ScrollingViewBehavior
ScrollingViewBehavior的简单应用大家参考一下这篇文章吧
http://blog.csdn.net/aqi00/article/details/56834285
系统默认提供的behavior毕竟只能实现一部分功能,下一篇博客我们将介绍如何使用自定义behavior来实现复杂的功能.