• 效果

RecyclerView交互动画主要使用的是ItemTouchHelper这个类

  • 创建MyItemTouchHelperCallback继承系统ItemTouchHelper.Callback
import android.graphics.Canvas;
import android.support.v7.widget.RecyclerView;
import android.support.v7.widget.helper.ItemTouchHelper;import tsou.cn.studyrecycler.R;/*** Created by Administrator on 2018/10/11 0011.*/public class MyItemTouchHelperCallback extends ItemTouchHelper.Callback {private ItemTouchMoveCallback mMoveCallback;public MyItemTouchHelperCallback(ItemTouchMoveCallback callback) {this.mMoveCallback = callback;}//Callback回调监听时先调用的,用来判断当前是什么动作,比如判断方向(监听哪个方向的拖动)@Overridepublic int getMovementFlags(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder) {//放向:up、down、left、right//常量:
//        int up = ItemTouchHelper.UP;//1  0x0001
//        int down = ItemTouchHelper.DOWN;//2 0x0010
//        int left = ItemTouchHelper.LEFT;
//        int right = ItemTouchHelper.RIGHT;//要监听的拖拽方向,不监听为0int dragFlags = ItemTouchHelper.UP | ItemTouchHelper.DOWN;//要监听的侧滑方向,不监听为0
//        int swipeFlags = 0;int swipeFlags = ItemTouchHelper.LEFT | ItemTouchHelper.RIGHT;int flags = makeMovementFlags(dragFlags, swipeFlags);return flags;//即监听向上也监听向下}//是否允许长按拖拽@Overridepublic boolean isLongPressDragEnabled() {return true;}//移动的时候回调的方法(拖拽等)@Overridepublic boolean onMove(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder, RecyclerView.ViewHolder target) {if (viewHolder.getItemViewType() != target.getItemViewType()) {return false;}//在拖拽的过程中不断地调用adapter.notifyItemMoved(from,to)mMoveCallback.onItemMove(viewHolder.getAdapterPosition(), target.getAdapterPosition());return true;}//侧滑的时候回调的方法@Overridepublic void onSwiped(RecyclerView.ViewHolder viewHolder, int direction) {//监听侧滑;1.删除数据,2.调用adapter.notifyItemRemoved(position)mMoveCallback.onItemRemove(viewHolder.getAdapterPosition());}//改变选中的Item@Overridepublic void onSelectedChanged(RecyclerView.ViewHolder viewHolder, int actionState) {//判断状态if (actionState != ItemTouchHelper.ACTION_STATE_IDLE) {viewHolder.itemView.findViewById(R.id.textview).setBackgroundColor(viewHolder.itemView.getContext().getResources().getColor(R.color.black));}super.onSelectedChanged(viewHolder, actionState);}//恢复改变选中的Item@Overridepublic void clearView(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder) {//恢复viewHolder.itemView.findViewById(R.id.textview).setBackgroundColor(viewHolder.itemView.getContext().getResources().getColor(R.color.colorPrimary));//透明度动画viewHolder.itemView.setAlpha(1);//1~0//缩放动画viewHolder.itemView.setScaleX(1);//1~0viewHolder.itemView.setScaleY(1);//1~0super.clearView(recyclerView, viewHolder);}//在拖拽的时候做效果@Overridepublic void onChildDraw(Canvas c, RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder, float dX, float dY, int actionState, boolean isCurrentlyActive) {//dx  水平方向移动的增量(负:向左;正:向右)范围:0~View.getWidthfloat alpha=1 - Math.abs(dX) / viewHolder.itemView.getWidth();if (actionState == ItemTouchHelper.ACTION_STATE_SWIPE) {//透明度动画viewHolder.itemView.setAlpha(alpha);//1~0//缩放动画viewHolder.itemView.setScaleX(alpha);//1~0viewHolder.itemView.setScaleY(alpha);//1~0}
//        if (alpha==0){
//            //透明度动画
//            viewHolder.itemView.setAlpha(1);//1~0
//            //缩放动画
//            viewHolder.itemView.setScaleX(1);//1~0
//            viewHolder.itemView.setScaleY(1);//1~0
//        }super.onChildDraw(c, recyclerView, viewHolder, dX, dY, actionState, isCurrentlyActive);}
}
  • MainAdapter
import android.content.Context;
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.MotionEvent;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.TextView;import java.util.Collections;
import java.util.List;import tsou.cn.studyrecycler.R;
import tsou.cn.studyrecycler.callback.ItemTouchMoveCallback;
import tsou.cn.studyrecycler.callback.StartDragCallback;/*** Created by Administrator on 2017/7/11 0011.*/public class MainAdapter extends RecyclerView.Adapter<MainAdapter.ViewHolder> implements ItemTouchMoveCallback {private Context mContext;private List<String> mLists;private StartDragCallback mCallback;public MainAdapter(Context context, List<String> lists, StartDragCallback callback) {this.mContext = context;this.mLists = lists;this.mCallback = callback;}@Overridepublic ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {View view = LayoutInflater.from(mContext).inflate(R.layout.item_main, parent, false);return new ViewHolder(view);}@Overridepublic void onBindViewHolder(final ViewHolder holder, int position) {holder.mTextview.setText(mLists.get(position));//解决触摸移动holder.mImageview.setOnTouchListener(new View.OnTouchListener() {@Overridepublic boolean onTouch(View v, MotionEvent event) {if (event.getAction() == MotionEvent.ACTION_DOWN) {//传递触摸情况(触摸移动)mCallback.onStartDrag(holder);}return false;}});}@Overridepublic boolean onItemMove(int fromPosition, int toPosition) {//1.数据交换;2.刷新Collections.swap(mLists, fromPosition, toPosition);notifyItemMoved(fromPosition, toPosition);return true;}@Overridepublic boolean onItemRemove(int position) {//1.删除数据,2.刷新mLists.remove(position);notifyItemRemoved(position);return true;}@Overridepublic int getItemCount() {return mLists.size();}class ViewHolder extends RecyclerView.ViewHolder {TextView mTextview;ImageView mImageview;ViewHolder(View view) {super(view);this.mTextview = (TextView) view.findViewById(R.id.textview);this.mImageview = (ImageView) view.findViewById(R.id.imageview);}}}
  • MainActivity

import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.support.v7.widget.helper.ItemTouchHelper;import java.util.ArrayList;import tsou.cn.lib_hxgioc.HxgBind;
import tsou.cn.lib_hxgioc.HxgContentView;
import tsou.cn.lib_hxgioc.HxgViewUtils;
import tsou.cn.studyrecycler.adatper.MainAdapter;
import tsou.cn.studyrecycler.callback.MyItemTouchHelperCallback;
import tsou.cn.studyrecycler.callback.StartDragCallback;@HxgContentView(R.layout.activity_main)
public class MainActivity extends AppCompatActivity implements StartDragCallback {@HxgBind(R.id.recyclerView)private RecyclerView mRecyclerView;private ArrayList<String> list = new ArrayList<>();private ItemTouchHelper itemTouchHelper;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);HxgViewUtils.getView().inject(this);for (int i = 0; i < 100; i++) {list.add("huangxiaoguo" + i);}mRecyclerView.setLayoutManager(new LinearLayoutManager(this));MainAdapter adapter = new MainAdapter(this, list, this);mRecyclerView.setAdapter(adapter);//条目触摸帮助类ItemTouchHelper.Callback callback = new MyItemTouchHelperCallback(adapter);itemTouchHelper = new ItemTouchHelper(callback);itemTouchHelper.attachToRecyclerView(mRecyclerView);}/*** 解决触摸移动** @param viewHolder*/@Overridepublic void onStartDrag(RecyclerView.ViewHolder viewHolder) {itemTouchHelper.startDrag(viewHolder);}
}

-手指触摸上下滑动监听StartDragCallback


public interface StartDragCallback {public void onStartDrag(RecyclerView.ViewHolder viewHolder);
}
  • 拖拽和侧滑回调 ItemTouchMoveCallback

import android.graphics.Canvas;
import android.support.v7.widget.RecyclerView;
import android.support.v7.widget.helper.ItemTouchHelper;import tsou.cn.studyrecycler.R;/*** Created by Administrator on 2018/10/11 0011.*/public class MyItemTouchHelperCallback extends ItemTouchHelper.Callback {private ItemTouchMoveCallback mMoveCallback;public MyItemTouchHelperCallback(ItemTouchMoveCallback callback) {this.mMoveCallback = callback;}//Callback回调监听时先调用的,用来判断当前是什么动作,比如判断方向(监听哪个方向的拖动)@Overridepublic int getMovementFlags(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder) {//放向:up、down、left、right//常量:
//        int up = ItemTouchHelper.UP;//1  0x0001
//        int down = ItemTouchHelper.DOWN;//2 0x0010
//        int left = ItemTouchHelper.LEFT;
//        int right = ItemTouchHelper.RIGHT;//要监听的拖拽方向,不监听为0int dragFlags = ItemTouchHelper.UP | ItemTouchHelper.DOWN;//要监听的侧滑方向,不监听为0
//        int swipeFlags = 0;int swipeFlags = ItemTouchHelper.LEFT | ItemTouchHelper.RIGHT;int flags = makeMovementFlags(dragFlags, swipeFlags);return flags;//即监听向上也监听向下}//是否允许长按拖拽@Overridepublic boolean isLongPressDragEnabled() {return true;}//移动的时候回调的方法(拖拽等)@Overridepublic boolean onMove(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder, RecyclerView.ViewHolder target) {if (viewHolder.getItemViewType() != target.getItemViewType()) {return false;}//在拖拽的过程中不断地调用adapter.notifyItemMoved(from,to)mMoveCallback.onItemMove(viewHolder.getAdapterPosition(), target.getAdapterPosition());return true;}//侧滑的时候回调的方法@Overridepublic void onSwiped(RecyclerView.ViewHolder viewHolder, int direction) {//监听侧滑;1.删除数据,2.调用adapter.notifyItemRemoved(position)mMoveCallback.onItemRemove(viewHolder.getAdapterPosition());}//改变选中的Item@Overridepublic void onSelectedChanged(RecyclerView.ViewHolder viewHolder, int actionState) {//判断状态if (actionState != ItemTouchHelper.ACTION_STATE_IDLE) {viewHolder.itemView.findViewById(R.id.textview).setBackgroundColor(viewHolder.itemView.getContext().getResources().getColor(R.color.black));}super.onSelectedChanged(viewHolder, actionState);}//恢复改变选中的Item@Overridepublic void clearView(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder) {//恢复viewHolder.itemView.findViewById(R.id.textview).setBackgroundColor(viewHolder.itemView.getContext().getResources().getColor(R.color.colorPrimary));//透明度动画viewHolder.itemView.setAlpha(1);//1~0//缩放动画viewHolder.itemView.setScaleX(1);//1~0viewHolder.itemView.setScaleY(1);//1~0super.clearView(recyclerView, viewHolder);}//在拖拽的时候做效果@Overridepublic void onChildDraw(Canvas c, RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder, float dX, float dY, int actionState, boolean isCurrentlyActive) {//dx  水平方向移动的增量(负:向左;正:向右)范围:0~View.getWidthfloat alpha=1 - Math.abs(dX) / viewHolder.itemView.getWidth();if (actionState == ItemTouchHelper.ACTION_STATE_SWIPE) {//透明度动画viewHolder.itemView.setAlpha(alpha);//1~0//缩放动画viewHolder.itemView.setScaleX(alpha);//1~0viewHolder.itemView.setScaleY(alpha);//1~0}
//        if (alpha==0){
//            //透明度动画
//            viewHolder.itemView.setAlpha(1);//1~0
//            //缩放动画
//            viewHolder.itemView.setScaleX(1);//1~0
//            viewHolder.itemView.setScaleY(1);//1~0
//        }super.onChildDraw(c, recyclerView, viewHolder, dX, dY, actionState, isCurrentlyActive);}
}

Demo地址:[https://download.csdn.net/download/huangxiaoguo1/10714254]

android:RecyclerView交互动画(上下拖动,左右滑动删除)相关推荐

  1. Android RecyclerView布局动画

    In this tutorial, we'll be discussing and implementing RecyclerView Layout Animations in our Android ...

  2. Android ItemTouchHelper实现RecyclerView交互动画

    在上一次博客 Android RecyclerView使用详解,主要介绍了RecyclerView的基础使用,本篇文章将主要介绍通过ItemToucheHelper辅助类完成RecyclerView的 ...

  3. Android开发之RecyclerView的交互动画(实现拖拽和删除)

    做RecyclerView做相关的动画效果的时候,用的最多的是v7包下的ItemTouchHelper类,这个类很强大,如有兴趣的童鞋可以自行翻看源码,接下来我带领大家实现RecyclerView相关 ...

  4. Android 用HorizontalScrollView实现ListView的Item滑动删除 ,滑动错乱 冲突

    用HorizontalScrollView实现类似微信的滑动删除 测试于:Android2.2+ 对于Android来说按键操作已经在减少,越来越多的手势操作层出不穷,今天介绍一款LIstView的I ...

  5. Android RecyclerView设置paddingBottom,scrollbars跟随滑动到底部

    <?xml version="1.0" encoding="utf-8"?> <androidx.recyclerview.widget.Re ...

  6. android 语音交互动画,Android实现客户端语音动弹界面实例代码

    首先,整体界面分三部分,最上层自定义ActionBar相信不需要我讲大家就能看出来了. 中间部分是文字动弹部分,主体就是一个设置了Padding(margin)的EditText,在EditText下 ...

  7. Android 用HorizontalScrollView实现ListView的Item滑动删除

    原理: 利用HorizontalScrollView可以横向滚动的特点实现滑动,根据动态的设置要展示的区域宽度,使得其余选项操作被挤出屏幕外面,从而实现单条滑动菜单的样式. 实现步骤: 实现Listv ...

  8. android.support.v7 fragme,打造最强RecyclerView侧滑菜单,长按拖拽Item,滑动删除Item

    前几天写了一片关于RecyclerView滑动删除Item,RecyclerView长按拖拽Item的博客,本来很简单一个使用,阅读量还挺高的,原博客传送门. 今天介绍一个RecyclerView I ...

  9. RecyclerView之使用ItemTouchHelper实现交互动画

    一.简述 RecyclerView默认就有item动画,例如在增加或删除item时,都会有一个条目间位移的动画,但本文要说的不是这个!!!本文的主角是v7包中的ItemTouchHelper,它跟Re ...

最新文章

  1. Hbase原理、基本概念、基本架构
  2. DPDK 初识DPDK(十五)
  3. Oracle cursor_sharing 参数 详解
  4. C++(五)——运算符重载
  5. [C++程序设计]字符数组的赋值与引用
  6. 局域网共享设置——权限问题
  7. DataAdapter对象填充数据集
  8. 从360和QQ打架看客户端的高精尖武器技术发展:自己留着,防止忘记!
  9. 软件编码测试要点总结
  10. 问卷数据分析(SPSSSPSS Modeler)
  11. 安卓谷歌地图 Google Maps不显示地图
  12. Matlab求解线性方程组Ax=b
  13. 【LaTeX应用】文字方向,文字竖排
  14. nyoj-1273 宣传墙
  15. 瀚高CEO苗健:用开源软件改变中国基础软件产业格局
  16. Hadoop-wordcount,合并多个part-*文件
  17. Flutter Hero 实现径向变换动画 — 圆形变成矩形的转场动画
  18. UI设计好学吗?UI设计的流程是什么
  19. RS232和RS485接口的问答
  20. 开发信三要素,看看你的开发信有吗?

热门文章

  1. TCP/UDP/IP/Socket的定义
  2. flutter 获取定位_Flutter 获取定位
  3. This must be due to duplicate classes or playing wrongly with class loaders
  4. 中国大学生计算机设计大赛英语,中国大学生计算机设计大赛
  5. 常见的防御DDoS攻击的方式有哪些?
  6. Windows上USB设备检测
  7. 搞懂它,带你学会高效配置交换机!
  8. 【已解决】ansys打开没有主界面,只有output窗口怎么回事?
  9. 心物各东西:基因,文化和心灵
  10. MVVM?继续搞一波