ItemTouchHelper 实现交互动画,深度解读Netty

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);

}

}

  • 如何使用,代码如下所示

ItemTouchHelpCallback callback = new ItemTouchHelpCallback((srcPosition, targetPosition) -> {

if (imageBeans != null) {

try {

// 更换数据源中的数据Item的位置。更改list中开始和结尾position的位置

Collections.swap(imageBeans, srcPosition, targetPosition);

// 更新UI中的Item的位置,主要是给用户看到交互效果

mAdapter.notifyItemMoved(srcPosition, targetPosition);

} catch (Exception e){

e.printStackTrace();

}

return true;

}

return true;

});

callback.setDragEnable(true);

callback.setSwipeEnable(true);

callback.setColor(this.getResources().getColor(R.color.base_background_block));

//创建helper对象,callback监听recyclerView item 的各种状态

ItemTouchHelper itemTouchHelper = new ItemTouchHelper(callback);

try{

//关联recyclerView,一个helper对象只能对应一个recyclerView

itemTouchHelper.attachToRecyclerView(recyclerView);

}catch (Exception e){

e.printStackTrace();

}

文末

当你打算跳槽的时候,应该把“跳槽成功后,我能学到什么东西?对我的未来发展有什么好处”放在第一位。这些东西才是真正引导你的关键。在跳槽之前尽量“物尽其用”,把手头上的工作做好,最好是完成了某个项目或是得到提升之后再走。跳槽不是目的,而是为了达到最终职业目标的手段

最后祝大家工作升职加薪,面试拿到心仪Offer.
为此我在文末整理了一些关于移动开发者需要的资料,欢迎大家免费领取
领取方式:点击我的GitHub


关于移动开发者需要的资料,欢迎大家免费领取
领取方式:点击我的GitHub

[外链图片转存中…(img-49CX6k2M-1643958518028)]
[外链图片转存中…(img-oIVLtK6s-1643958518029)]

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值