由于项目中需要实现列表可长按条目拖动改变位置的效果,网上有很多成型的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)
}
}
})

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

被折叠的 条评论
为什么被折叠?



