效果内容主要有三部分:
•长按点击其中一个Item之后可以将其拖动到其他地方
•向左右滑动可以删除某个Item
•长按的时候会有一个浮起的动作,放下之后会重新重新对齐
①先易后难,卡片浮起效果
在Material Design中,物件的呈现是以3d的模式来进行的,也就是在原来的基础上增加了一个Z轴来表示物体的高度。

当我们点击一个卡片的时候,应该给予用户一些反馈,让用户知道自己在操作这个卡片,也就是触摸反馈。触摸效果图的触摸反馈是先出现水波纹,接着当卡片可以移动的时候先浮动,再开始移动,最后下落,效果如下:(浮起的动画可能要仔细看)

实现:
水波纹效果使用系统提供的,因为Demo中使用的是一个CardView来呈现内容,所以只需要给CardView加上两个属性即可:
android:clickable="true"
android:foreground="?android:attr/selectableItemBackground"
浮起和下沉的动画也不难,改变View的translationZ属性即可:
private void pickUpAnimation(View view) {ObjectAnimator animator = ObjectAnimator.ofFloat(view, "translationZ", 1f, 10f);animator.setInterpolator(new DecelerateInterpolator());animator.setDuration(300);animator.start();}②滑动(Swipe)和移动(Move)Itemnew ItemTouchHelper(new ItemTouchHelper.Callback() {private RecyclerView.ViewHolder vh;@Overridepublic boolean isItemViewSwipeEnabled() {return true;}@Overridepublic boolean isLongPressDragEnabled() {return true;}@Overridepublic int getMovementFlags(RecyclerView recyclerView, RecyclerView.ViewHolderviewHolder) {// 拖拽的标记,这里允许上下左右四个方向int dragFlags = ItemTouchHelper.UP | ItemTouchHelper.DOWN | ItemTouchHelper.LEFT |ItemTouchHelper.RIGHT;// 滑动的标记,这里允许左右滑动int swipeFlags = ItemTouchHelper.START | ItemTouchHelper.END;return makeMovementFlags(dragFlags, swipeFlags);}/*这个方法会在某个Item被拖动和移动的时候回调,这里我们用来播放动画,当viewHolder不为空时为选中状态否则为释放状态 */@Overridepublic void onSelectedChanged(RecyclerView.ViewHolder viewHolder, int actionState) {super.onSelectedChanged(viewHolder, actionState);if (viewHolder != null) {vh = viewHolder;pickUpAnimation(viewHolder.itemView);} else {if (vh != null) {putDownAnimation(vh.itemView);}}}@Overridepublic boolean onMove(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder, RecyclerView.ViewHolder target) {// 移动时更改列表中对应的位置并返回trueCollections.swap(newsList, viewHolder.getAdapterPosition(), target.getAdapterPosition());return true;}/*当onMove返回true时调用 */@Overridepublic void onMoved(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder, intfromPos, RecyclerView.ViewHolder target, int toPos, int x, int y) {super.onMoved(recyclerView, viewHolder, fromPos, target, toPos, x, y);// 移动完成后刷新列表mAdapter.notifyItemMoved(viewHolder.getAdapterPosition(), target.getAdapterPosition());}@Overridepublic void onSwiped(RecyclerView.ViewHolder viewHolder, int direction) {// 将数据集中的数据移除newsList.remove(viewHolder.getAdapterPosition());// 刷新列表mAdapter.notifyItemRemoved(viewHolder.getAdapterPosition());}}).attachToRecyclerView(mRecyclerView);这里直接贴出代码,并做了注释,应该比较简单了。