自定义View学习(三)自定义可拖动的RecyclerView

该博客围绕项目中实现列表可长按条目拖动改变位置的效果展开。介绍了预期效果,包括列表形式、条目动画等。思路是用RecycleView实现列表,缩放动画实现动画效果。还讲解了缩放动画的参数及Java代码使用,最后给出了完整代码和参考文献。

由于项目中需要实现列表可长按条目拖动改变位置的效果,网上有很多成型的demo,写的都非常好,自己下载研究后,自己模仿着写了一个,以下作为整理:

前言
  • 预期效果
    列表形式、长按条目放大动画,拖动修改列表中item位置,松开时候显示缩小动画
  • 思路
    列表使用RecycleView,动画使用ScaleAnimation(缩放动画),拖动功能使用ItemTouchHelper
知识点讲解
  • ScaleAnimation缩放动画的使用
ScaleAnimation mScaleAnimation=new ScaleAnimation(float fromX, 
         float toX, float fromY, float toY,int pivotXType, float pivotXValue, 
         int pivotYType, float pivotYValue)

fromX:动画开始前在X坐标的大小。
toX:动画结束后在X坐标的大小。
fromY:动画开始前在Y坐标的大小。
toY:动画结束后在Y坐标的大小。
pivotXType:缩放中心点的X坐标类型。取值范围为ABSOLUTE、RELATIVE_TO_SELF、 RELATIVE_TO_PARENT。
pivotXValue:缩放中心点的X坐标值。当pivotXType==ABSOLUTE时,表示绝对位置;否则表示相对位置,1.0表示100%。
pivotYType:缩放中心点的Y坐标类型。
pivotYValue:缩放中心点的Y坐标。

Java代码使用:

//放大效果:
 private var startAnimation: ScaleAnimation? = ScaleAnimation(
        1.0f,
        1.1f,
        1.0f,
        1.1f,
        Animation.RELATIVE_TO_SELF,
        0.5f,
        Animation.RELATIVE_TO_SELF,
        0.5f
    )
//从放大恢复至原来的效果
 private var endAnimation: ScaleAnimation? = ScaleAnimation(
        1.1f,
        1.0f,
        1.1f,
        1.0f,
        Animation.RELATIVE_TO_SELF,
        0.5f,
        Animation.RELATIVE_TO_SELF,
        0.5f
    )
  • ItemTouchHelper
    作为RecyclerView的辅助类ItemTouchHelper,在实现侧滑删除和拖动交换位置的时候便展示出举足轻重的作用。
    ItemTouchHelper继承了ItemDecoration
public class ItemTouchHelper extends RecyclerView.ItemDecoration
        implements RecyclerView.OnChildAttachStateChangeListener {
   
   
}

ItemTouchHelper的使用:

var mDragItemTouchHelper =ItemTouchHelper(object : ItemTouchHelper.Callback() {
   
   

       /**
        * 在此方法里面我们需要构建两个flag,一个是dragFlags,表示拖动效果支持的方向,
        * 另一个是swipeFlags,表示侧滑效果支持的方向。在我们的Demo中,拖动执行上下两个方向,
        * 侧滑执行左右两个方向,这些操作我们都可以在此方法里面定义。
        */
       override fun getMovementFlags(recyclerView: RecyclerView, viewHolder: ViewHolder): Int {
   
   
           //上下滑动
           val dragFlags = ItemTouchHelper.UP or ItemTouchHelper.DOWN
           //向左滑动
           val swipeFlags = ItemTouchHelper.LEFT or ItemTouchHelper.RIGHT
           //return makeMovementFlags(dragFlags, swipeFlags)
              return makeMovementFlags(dragFlags, 0)//此处禁止侧滑删除
       }

       /**
        * 当拖动效果已经产生了,会回调此方法。在此方法里面,我们通常会更新数据源,
        * 比如说,一个ItemView从0拖到了1位置,那么对应的数据源也需要更改位置。
        */
       override fun onMove(
           recyclerView: RecyclerView,
           viewHolder: ViewHolder,
           target: ViewHolder
       ): Boolean {
   
   

           oldPosition=viewHolder.adapterPosition
           toPosition=target.adapterPosition

           return  mItemTouchStatus!!.onItemMove(viewHolder.adapterPosition, target.adapterPosition)
       }

       /**
        * 当侧滑效果以上产生了,会回调此方法。在此方法里面,我们也会更新数据源。
        * 与onMove方法不同到的是,我们在这个方法里面从数据源里面移除相应的数据,
        * 然后调用notifyXXX方法就行了。
        */
       override fun onSwiped(viewHolder: ViewHolder, direction: Int) {
   
   
       }

       override fun onSelectedChanged(viewHolder: ViewHolder?, actionState: Int) {
   
   
           /**
            * actionState:
            * 1.ACTION_STATE_IDLE表示没有任何手势,此时selected对应的应当是null;
            * 2. ACTION_STATE_SWIPE表示当前ItemView处于侧滑状态;
            * 3. ACTION_STATE_DRAG表示当前ItemView处于拖动状态。
            */
           if (showDragAnimation && actionState == ItemTouchHelper.ACTION_STATE_DRAG) {
   
   
               startAnimation(viewHolder!!.itemView)
           }
           super.onSelectedChanged(viewHolder, actionState)
       }

       override fun clearView(recyclerView: RecyclerView, viewHolder: ViewHolder) {
   
   
           super.clearView(recyclerView, viewHolder)
           if (showDragAnimation) {
   
   
               //操作结束后会走这个方法
               removeView(viewHolder.itemView)
           }
       }

   })
完整代码:
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值