android:RecyclerView交互动画(上下拖动,左右滑动删除)
- 效果
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交互动画(上下拖动,左右滑动删除)相关推荐
- Android RecyclerView布局动画
In this tutorial, we'll be discussing and implementing RecyclerView Layout Animations in our Android ...
- Android ItemTouchHelper实现RecyclerView交互动画
在上一次博客 Android RecyclerView使用详解,主要介绍了RecyclerView的基础使用,本篇文章将主要介绍通过ItemToucheHelper辅助类完成RecyclerView的 ...
- Android开发之RecyclerView的交互动画(实现拖拽和删除)
做RecyclerView做相关的动画效果的时候,用的最多的是v7包下的ItemTouchHelper类,这个类很强大,如有兴趣的童鞋可以自行翻看源码,接下来我带领大家实现RecyclerView相关 ...
- Android 用HorizontalScrollView实现ListView的Item滑动删除 ,滑动错乱 冲突
用HorizontalScrollView实现类似微信的滑动删除 测试于:Android2.2+ 对于Android来说按键操作已经在减少,越来越多的手势操作层出不穷,今天介绍一款LIstView的I ...
- Android RecyclerView设置paddingBottom,scrollbars跟随滑动到底部
<?xml version="1.0" encoding="utf-8"?> <androidx.recyclerview.widget.Re ...
- android 语音交互动画,Android实现客户端语音动弹界面实例代码
首先,整体界面分三部分,最上层自定义ActionBar相信不需要我讲大家就能看出来了. 中间部分是文字动弹部分,主体就是一个设置了Padding(margin)的EditText,在EditText下 ...
- Android 用HorizontalScrollView实现ListView的Item滑动删除
原理: 利用HorizontalScrollView可以横向滚动的特点实现滑动,根据动态的设置要展示的区域宽度,使得其余选项操作被挤出屏幕外面,从而实现单条滑动菜单的样式. 实现步骤: 实现Listv ...
- android.support.v7 fragme,打造最强RecyclerView侧滑菜单,长按拖拽Item,滑动删除Item
前几天写了一片关于RecyclerView滑动删除Item,RecyclerView长按拖拽Item的博客,本来很简单一个使用,阅读量还挺高的,原博客传送门. 今天介绍一个RecyclerView I ...
- RecyclerView之使用ItemTouchHelper实现交互动画
一.简述 RecyclerView默认就有item动画,例如在增加或删除item时,都会有一个条目间位移的动画,但本文要说的不是这个!!!本文的主角是v7包中的ItemTouchHelper,它跟Re ...
最新文章
- Hbase原理、基本概念、基本架构
- DPDK 初识DPDK(十五)
- Oracle cursor_sharing 参数 详解
- C++(五)——运算符重载
- [C++程序设计]字符数组的赋值与引用
- 局域网共享设置——权限问题
- DataAdapter对象填充数据集
- 从360和QQ打架看客户端的高精尖武器技术发展:自己留着,防止忘记!
- 软件编码测试要点总结
- 问卷数据分析(SPSSSPSS Modeler)
- 安卓谷歌地图 Google Maps不显示地图
- Matlab求解线性方程组Ax=b
- 【LaTeX应用】文字方向,文字竖排
- nyoj-1273 宣传墙
- 瀚高CEO苗健:用开源软件改变中国基础软件产业格局
- Hadoop-wordcount,合并多个part-*文件
- Flutter Hero 实现径向变换动画 — 圆形变成矩形的转场动画
- UI设计好学吗?UI设计的流程是什么
- RS232和RS485接口的问答
- 开发信三要素,看看你的开发信有吗?