我正在开发一个Android应用程序,在其中我需要具有通过拖放来更改RecyclerView中卡片顺序的功能。到目前为止,我可以通过拖动来移动卡。但是我面临一个问题,就是当我将其下方的卡拖动到该卡下方的卡的后面时,而当我向上移动它时,该卡位于其上方的卡的前面,如图所示。
我希望将要拖动的那张卡片始终放在其他卡片上方。因此,我尝试为正在移动的卡提供额外的仰角,但是结果还是一样。以下是与我的应用程序此部分相关的代码段。 应用的最低SDK为22
卡布局XML文件。 (文件太大,无法在此处显示,因此仅作为概述。压缩视图没有任何高程属性。)
onTouch侦听器的内容。
moveButton.setOnTouchListener({v: View?, event: MotionEvent? ->
if (v == null || event == null) return@setOnTouchListener true
when (event.action){
MotionEvent.ACTION_UP -> {
v.performClick()
pressUP(v,event)
}
MotionEvent.ACTION_DOWN -> {
pressDown(v,event)
}
MotionEvent.ACTION_MOVE -> {
pressMove(v,event)
}
else -> {
null
}
}
return@setOnTouchListener true
})
private fun pressDown(imageButton: View, event: MotionEvent){
openedLayoutManagerLocal?.closeOpenedLayout()
fragment.mLayoutManager?.setScrollEnabled(false)
originalDelta = itemView.y
_yDelta = itemView.y - event.rawY
itemView.elevateLayoutLocal.elevation = elevation + 10 // as all layouts are by default elevated by 5
}
private fun pressUP(imageButton: View, event: MotionEvent){
fragment.mLayoutManager?.setScrollEnabled(true)
val a = itemView.animate()
.y(originalDelta)
.setDuration(100)
a.setListener(object : Animator.AnimatorListener{
override fun onAnimationEnd(animation: Animator?) {
itemView.elevateLayoutLocal.elevation = elevation + 5
}
override fun onAnimationStart(animation: Animator?) {
}
override fun onAnimationRepeat(animation: Animator?) {
}
override fun onAnimationCancel(animation: Animator?) {
itemView.elevateLayoutLocal.elevation = elevation + 5
}
})
a.start()
}
private fun pressMove(imageButton: View, event: MotionEvent){
itemView.animate()
.y(event.rawY + _yDelta)
.setDuration(0)
.start()
}
那么我分配高程有什么问题吗? 我也想知道是否还有其他方法可以达到这种效果。 预先谢谢你。