微信扫一扫

028-83195727 , 15928970361
business@forhy.com

Material Design系列,Behavior之SwipeDismissBehavior

Behavior,Android-MD2016-07-18

Material Design系列,Behavior之SwipeDismissBehavior

版权声明:转载必须注明本文转自严振杰的博客: http://blog.csdn.net/yanzhenjie1003

Material Design系列,Behavior之BottomSheetBehavior与BottomSheetDialog


效果预览

源码传送门。

SwipeDismissBehavior介绍

在我的群(百度:严振杰 愚公移山可找到群)里听说Behavior很难,我就去玩了玩。选中Behavior然后ctrol + t后发现Behavior的一个实现类:SwipeDismissBehavior,顾名思义它就是用来实现滑动删除的了。我们之前出过一篇RecyclerView利用ItemTouchHelper拖拽排序/滑动删除Item的博客,那我们今天来看看SwipeDismissBehavior是如何玩的,是否可以替代RecyclerView自带的ItemTouchHelper

踩坑

上一篇博客讲了 Material Design系列,Behavior之BottomSheetBehavior与BottomSheetDialog,我们知道不论BottomSheetBehavior还是ScrollingViewBehavior都可以在xml中直接指定:

 app:layout_behavior="@string/appbar_scrolling_view_behavior"
 ...
 app:layout_behavior="@string/bottom_sheet_behavior"

还有我们知道app:layout_behavior=""的值是Behavior的全类名,虽然是字符串。于是乎,当我看到SwipeDismissBehavior我也在string.xml中定义了一下:

<string name="swipe_dismiss_behavior">android.support.design.widget.SwipeDismissBehavior</string>

我也像上面那么引用了,结果就报错了,心里哇凉哇凉的:

android.view.InflateException: Binary XML file line #19: Could not inflate Behavior subclass android.support.design.widget.SwipeDismissBehavior

所以用法肯定不是这样的,且看我怎么解决。

SwipeDismissBehavior的正确使用姿势

首先翻官网的资料,全都是英文的,还要翻墙。各位看官根据自己的情况看着办噢。

经过我的一番折腾,这货原来是这样用的,首先上我的布局:

<android.support.design.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:id="@+id/coordinatorlayout"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <android.support.design.widget.AppBarLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:theme="@style/AppTheme.AppBarOverlay">

        <android.support.v7.widget.Toolbar
            android:id="@+id/toolbar"
            android:layout_width="match_parent"
            android:layout_height="?attr/actionBarSize"
            app:popupTheme="@style/AppTheme.PopupOverlay" />
    </android.support.design.widget.AppBarLayout>

    <TextView
        android:id="@+id/textview"
        android:layout_width="match_parent"
        android:layout_height="100dp"
        android:layout_marginTop="60dp"
        android:background="@android:color/holo_blue_bright"
        android:gravity="center"
        android:text="滑动删除我呀" />
</android.support.design.widget.CoordinatorLayout>

简单解释下,一个CoordinatorLayout下一个Toolbar,一个TextView,我们滑动删除的就是这个TextView

然后上Java代码:

SwipeDismissBehavior swipeDismissBehavior = new SwipeDismissBehavior();
swipeDismissBehavior.setSwipeDirection(SwipeDismissBehavior.SWIPE_DIRECTION_ANY);
CoordinatorLayout.LayoutParams coordinatorParams = (CoordinatorLayout.LayoutParams) findViewById(R.id.textview).getLayoutParams();
coordinatorParams.setBehavior(swipeDismissBehavior);

一运行我发现真的可以了唉,哎呀我擦累,好简单啊这货,不过这货还是有些属性的:

// 告诉如果一个视图设置阈值一直拖到足以被关闭。
swipeDismissBehavior.setDragDismissDistance(0.5F);

// 最小滑动距离时view的透明度。
swipeDismissBehavior.setStartAlphaSwipeDistance(0F);

// 最大滑动距离时biew的透明度。
swipeDismissBehavior.setEndAlphaSwipeDistance(0.5F);

// 阀值,也就是敏感度。
swipeDismissBehavior.setSensitivity(0);

// 滑动方向。
swipeDismissBehavior.setSwipeDirection(SwipeDismissBehavior.SWIPE_DIRECTION_START_TO_END);

还可以设置关闭监听等:

swipeDismissBehavior.setListener(onDismissListener);

private SwipeDismissBehavior.OnDismissListener onDismissListener = new SwipeDismissBehavior.OnDismissListener() {
        @Override
        public void onDismiss(View view) {
        }

        @Override
        public void onDragStateChanged(int state) {
        }
    };

到这里就结束了,不过我们还是回到文章的开头,那么我们的问题来了?SwipeDismissBehavior可以替代RecyclerViewItemTouchHelper或者其他列表滑动删除库吗?

答案是不能。

因为CoordinatorLayout遍历子View的时候,只遍历了第一层view,而列表的滑动删除对象是在RecyclerView的里面,不是CoordinatorLayout的直接子view。所以SwipeDismissBehavior只可以用在CoordinatorLayout的子View上。

源码传送门。


版权声明:转载必须注明本文转自严振杰的博客: http://blog.csdn.net/yanzhenjie1003