Android仿探探卡片式滑动效果实现

  

  

第一次进入探探软件界面,就被这种通过卡片式滑动来选择“喜欢/不喜欢”的设计所吸引了。当时就非常想通过自己来实现这种仿探探式的效果,然而却没什么思路。不过毋庸置疑的是,这种效果的原理肯定和列表视图/RecyclerView类似,涉及到项目视图的回收和重用,否则早就因为大量的项目视图而伯父了。
  

  

再到后来,看到许多大神也推出了同样仿探探效果的博客,从头到尾阅读下来,写得通俗易懂,基本上没什么问题。于是,实现仿探探效果的想法再次出现在脑海中。那么,还犹豫什么,趁热来一发吧!就这么愉快地决定了。
  

  

<强>首先面临的问题就是关于实现视图上的考虑。毫无疑问。
  

  

RecyclerView是最佳选择!
  

  

RecyclerView是最佳选择!
  

  

RecyclerView是最佳选择!
  

  

重要的话讲三遍! ! !
  

  

究其原因,第一,RecyclerView是自带项目视图回收和重用功能的,就不需要我们考虑这个问题了;第二,RecyclerView的布局方式是通过设置LayoutManager来实现的,这样就充分地把布局和RecyclerView“解耦”开来了。而LayoutManager是可以通过自定义的方式来实现的。这恰恰是我们想要的! ! !再说一点,这也正是不选用ListView的原因之一。
  

  

  

<强> CardLayoutManager
  

  

创建CardLayoutManager并继承自<代码> RecyclerView。LayoutManager> generateDefaultLayoutParams() 方法:
  

        @Override      公共RecyclerView。LayoutParams generateDefaultLayoutParams () {      返回新RecyclerView.LayoutParams (ViewGroup.LayoutParams。WRAP_CONTENT ViewGroup.LayoutParams.WRAP_CONTENT);      }      

一般情况下,像上面这样写即可。
  

  

下面这个方法就是我们的重点了。<代码> onLayoutChildren(最终RecyclerView。回收商回收商,RecyclerView。状态状态)方法就是用来实现项目视图布局的:
  

        @Override      公共空间alt=" Android仿探探卡片式滑动效果实现“>
  

  

可以看的出,大致的效果已经有了。缺少的就是处理触摸滑动事件了。
  

  

<强> OnSwipeListener
  

  

在看滑动事件的代码之前,我们先定义一个监听器。主要用于监听卡片滑动事件,代码就如下所示,注释也给出来了。应该都看得懂吧:
  

        公共接口>   @Override      公共int getMovementFlags (RecyclerView RecyclerView RecyclerView。ViewHolder ViewHolder) {      int dragFlags=0;      int swipeFlags=0;      RecyclerView。LayoutManager LayoutManager=recyclerView.getLayoutManager ();      如果(layoutManager instanceof CardLayoutManager) {      swipeFlags=ItemTouchHelper。左| ItemTouchHelper.RIGHT;      }      返回makeMovementFlags (dragFlags swipeFlags);      }      

还有一点需要注意,前面说过,为了防止第二层和第三层卡片也能滑动,因此我们需要设置<代码> isItemViewSwipeEnabled() 返回假。
  

        @Override      公共布尔isItemViewSwipeEnabled () {      返回错误;      }      

接下来,就是去重写o <代码> nMove (RecyclerView RecyclerView, RecyclerView。ViewHolder ViewHolder RecyclerView。ViewHolder目标)和<代码> onswipe (RecyclerView。ViewHolder ViewHolder, int方向)方法。但是因为在上面我们对于dragFlags配置的是0,所以在<代码> onMove (RecyclerView RecyclerView, RecyclerView。ViewHolder ViewHolder RecyclerView。ViewHolder目标)中直接返回假即可。
  

        @Override      公共布尔>   @Override      公共空间alt=" Android仿探探卡片式滑动效果实现">

  

发现还是差了点什么,没错!是缺少了动画。在滑动的过程中我们可以重写<代码> onChildDraw(帆布c, RecyclerView RecyclerView, RecyclerView。ViewHolder ViewHolder,浮动dX, dY浮动,int actionState,布尔isCurrentlyActive) 方法来添加动画:
  

        @Override      公共空间>   @Override      去年clearView公共空间(RecyclerView RecyclerView RecyclerView。ViewHolder ViewHolder) {      超级。去年clearView (recyclerView viewHolder);      viewHolder.itemView.setRotation f (0);      }

Android仿探探卡片式滑动效果实现