当前位置: 代码网 > it编程>App开发>Android > ItemTouchHelper 实现交互动画

ItemTouchHelper 实现交互动画

2024年08月06日 Android 我要评论
如果你看到了这里,觉得文章写得不错就给个赞呗?如果你觉得那里值得改进的,请给我留言。一定会认真查询,修正不足。欢迎大家一起交流讨论啊~《Android学习笔记总结+移动架构视频+大厂面试真题+项目实战源码》点击传送门,即可获取!m srcPosition 拖拽的item的position@param targetPosition 目的地的Item的position@return 开发者处理了操作应该返回true,开发者没有处理就返回false。
  • desc  : 自定义itemtouchhelper
    
  • revise: 参考严正杰大神博客:https://blog.csdn.net/yanzhenjie1003/article/details/51935982
    

*/

public class itemtouchhelpcallback extends itemtouchhelper.callback {

/**

  • item操作的回调,去更新ui和数据源

*/

private onitemtouchcallbacklistener onitemtouchcallbacklistener;

/**

  • 是否可以拖拽

*/

private boolean iscandrag = false;

/**

  • 是否可以被滑动

*/

private boolean iscanswipe = false;

/**

  • 按住拖动item的颜色

*/

private int color = 0;

public itemtouchhelpcallback(onitemtouchcallbacklistener onitemtouchcallbacklistener) {

this.onitemtouchcallbacklistener = onitemtouchcallbacklistener;

}

/**

  • 设置是否可以被拖拽

  • @param candrag 是true,否false

*/

public void setdragenable(boolean candrag) {

iscandrag = candrag;

}

/**

  • 设置是否可以被滑动

  • @param canswipe 是true,否false

*/

public void setswipeenable(boolean canswipe) {

iscanswipe = canswipe;

}

/**

  • 设置按住拖动item的颜色

  • @param color 颜色

*/

public void setcolor(@colorint int color){

this.color = color;

}

/**

  • 当item被长按的时候是否可以被拖拽

  • @return true

*/

@override

public boolean islongpressdragenabled() {

return iscandrag;

}

/**

  • item是否可以被滑动(h:左右滑动,v:上下滑动)

  • isitemviewswipeenabled()返回值是否可以拖拽排序,true可以,false不可以

  • @return true

*/

@override

public boolean isitemviewswipeenabled() {

return iscanswipe;

}

/**

  • 当用户拖拽或者滑动item的时候需要我们告诉系统滑动或者拖拽的方向

  • 动作标识分:dragflags和swipeflags

  • dragflags:列表滚动方向的动作标识(如竖直列表就是上和下,水平列表就是左和右)

  • wipeflags:与列表滚动方向垂直的动作标识(如竖直列表就是左和右,水平列表就是上和下)

  • 思路:如果你不想上下拖动,可以将 dragflags = 0

  •  如果你不想左右滑动,可以将 swipeflags = 0
    
  •  最终的动作标识(flags)必须要用makemovementflags()方法生成
    

*/

@override

public int getmovementflags(@nonnull recyclerview recyclerview,

@nonnull recyclerview.viewholder viewholder) {

recyclerview.layoutmanager layoutmanager = recyclerview.getlayoutmanager();

if (layoutmanager instanceof gridlayoutmanager) {

// flag如果值是0,相当于这个功能被关闭

int dragflag = itemtouchhelper.left | itemtouchhelper.right

| itemtouchhelper.up | itemtouchhelper.down;

int swipeflag = 0;

// create make

return makemovementflags(dragflag, swipeflag);

} else if (layoutmanager instanceof linearlayoutmanager) {

linearlayoutmanager linearlayoutmanager = (linearlayoutmanager) layoutmanager;

int orientation = linearlayoutmanager.getorientation();

int dragflag = 0;

int swipeflag = 0;

// 为了方便理解,相当于分为横着的listview和竖着的listview

// 如果是横向的布局

if (orientation == linearlayoutmanager.horizontal) {

swipeflag = itemtouchhelper.up | itemtouchhelper.down;

dragflag = itemtouchhelper.left | itemtouchhelper.right;

} else if (orientation == linearlayoutmanager.vertical) {

// 如果是竖向的布局,相当于listview

dragflag = itemtouchhelper.up | itemtouchhelper.down;

swipeflag = itemtouchhelper.left | itemtouchhelper.right;

}

//第一个参数是拖拽flag,第二个是滑动的flag

return makemovementflags(dragflag, swipeflag);

}

return 0;

}

/**

  • 当item被拖拽的时候被回调

  • @param recyclerview recyclerview

  • @param srcviewholder 当前被拖拽的item的viewholder

  • @param targetviewholder 当前被拖拽的item下方的另一个item的viewholder

  • @return 是否被移动

*/

@override

public boolean onmove(@nonnull recyclerview recyclerview,

@nonnull recyclerview.viewholder srcviewholder,

@nonnull recyclerview.viewholder targetviewholder) {

if (onitemtouchcallbacklistener != null) {

int srcposition = srcviewholder.getadapterposition();

int targetposition = targetviewholder.getadapterposition();

return onitemtouchcallbacklistener.onmove(srcposition, targetposition);

}

return false;

}

/**

  • 当item侧滑出去时触发(竖直列表是侧滑,水平列表是竖滑)

  • @param viewholder viewholder

  • @param direction 滑动的方向

*/

@override

public void onswiped(@nonnull recyclerview.viewholder viewholder, int direction) {

if (onitemtouchcallbacklistener != null) {

onitemtouchcallbacklistener.onswiped(viewholder.getadapterposition());

}

}

/**

  • 当item被拖拽或侧滑时触发

  • @param viewholder viewholder

  • @param actionstate 当前item的状态

*/

@override

public void onselectedchanged(recyclerview.viewholder viewholder, int actionstate) {

super.onselectedchanged(viewholder, actionstate);

//不管是拖拽或是侧滑,背景色都要变化

if (actionstate != itemtouchhelper.action_state_idle) {

if (color==0){

viewholder.itemview.setbackgroundcolor(viewholder.itemview.getcontext()

.getresources().getcolor(android.r.color.darker_gray));

}else {

viewholder.itemview.setbackgroundcolor(color);

}

}

}

/**

  • 当item的交互动画结束时触发

  • @param recyclerview recyclerview

  • @param viewholder viewholder

*/

@override

public void clearview(@nonnull recyclerview recyclerview,

@nonnull recyclerview.viewholder viewholder) {

super.clearview(recyclerview, viewholder);

viewholder.itemview.setbackgroundcolor(viewholder.itemview.getcontext().getresources()

.getcolor(android.r.color.white));

viewholder.itemview.setalpha(1);

viewholder.itemview.setscaley(1);

}

@override

public void onchilddraw(@nonnull canvas c, @nonnull recyclerview recyclerview,

@nonnull recyclerview.viewholder viewholder,

float dx, float dy, int actionstate, boolean iscurrentlyactive) {

super.onchilddraw(c, recyclerview, viewholder, dx, dy, actionstate, iscurrentlyactive);

if (actionstate == itemtouchhelper.action_state_swipe) {

float value = 1 - math.abs(dx) / viewholder.itemview.getwidth();

viewholder.itemview.setalpha(value);

viewholder.itemview.setscaley(value);

}

}

public interface onitemtouchcallbacklistener {

/**

  • 当某个item被滑动删除的时候

  • @param adapterposition item的position

*/

void onswiped(int adapterposition);

/**

  • 当两个item位置互换的时候被回调

  • @param srcposition 拖拽的item的position

  • @param targetposition 目的地的item的position

  • @return 开发者处理了操作应该返回true,开发者没有处理就返回false

*/

boolean onmove(int srcposition, int targetposition);

}

}

最后

如果你看到了这里,觉得文章写得不错就给个赞呗?如果你觉得那里值得改进的,请给我留言。一定会认真查询,修正不足。谢谢。

欢迎大家一起交流讨论啊~
《android学习笔记总结+移动架构视频+大厂面试真题+项目实战源码》,即可获取!
m srcposition 拖拽的item的position

  • @param targetposition 目的地的item的position

  • @return 开发者处理了操作应该返回true,开发者没有处理就返回false

*/

boolean onmove(int srcposition, int targetposition);

}

}

最后

如果你看到了这里,觉得文章写得不错就给个赞呗?如果你觉得那里值得改进的,请给我留言。一定会认真查询,修正不足。谢谢。

[外链图片转存中…(img-r7ruanwn-1715839353457)]

欢迎大家一起交流讨论啊~
《android学习笔记总结+移动架构视频+大厂面试真题+项目实战源码》,即可获取!

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2025  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com