首页 > 解决方案 > Recyclerview 自动滚动问题:将带有图像的 recyclerview 拖放到列表外

问题描述


我创建了一个 Recyclerview 列表,其中嵌套了另一个水平 recyclerview 和拖放功能。我想在列表中拖动图像,所以我尝试了很多代码,但仍然无法平滑滚动并正确关注 Drop View。当我拖动图像拖动位置滚动到另一个位置。

我有图片和视频,请检查

图片1 图片2

请查看视频: 列表拖放视频

任何人有解决方案?

和代码如下:

 mBinding.dragView.setOnTouchListener(this)


override fun onTouch(v: View?, event: MotionEvent?): Boolean {
    val mShadow = CustomScaledDragShadowBuilder(v!!, 0.26f)
    val item = ClipData.Item(v.tag.toString())
    val mimeTypes = arrayOf(ClipDescription.MIMETYPE_TEXT_PLAIN)
    val data = ClipData(v.tag.toString(), mimeTypes, item)

    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
        v.startDragAndDrop(data, mShadow, null, 0)
    } else {
        v.startDrag(data, mShadow, null, 0)
    }

    return false
}


override fun onDrag(v: View?, event: DragEvent?): Boolean {
    return when (event!!.action) {
        DragEvent.ACTION_DRAG_STARTED -> {
            hideVisibleRecipeImage(false)
            true
        }
        DragEvent.ACTION_DRAG_ENTERED -> {
            manageDragEnableViewBg(v, true)
            true
        }
        DragEvent.ACTION_DRAG_LOCATION -> {
            true
        }
        DragEvent.ACTION_DRAG_EXITED -> {
            manageDragEnableViewBg(v, false)
            true
        }
        DragEvent.ACTION_DROP -> {
            manageDragEnableViewBg(v, false)
            showDragImages(v!!)
            true
        }
        DragEvent.ACTION_DRAG_ENDED -> {
            hideVisibleRecipeImage(true)
            true
        }
        else -> false
    }
}


 private fun hideVisibleRecipeImage(isEnd: Boolean) {
    if (isEnd) {
        mBinding.animImg1.visibility = View.VISIBLE
    } else {
        mBinding.animImg1.visibility = View.INVISIBLE
    }
}


  private fun manageDragEnableViewBg(view: View?, isEnable: Boolean) {
    if (isEnable) {
        val set = AnimatorSet()
        val objX = ObjectAnimator.ofFloat(view, View.SCALE_X, 1f, 1.162f)
        val objY = ObjectAnimator.ofFloat(view, View.SCALE_Y, 1f, 1.162f)
        set.playTogether(objX, objY)
        set.start()
    } else {
        val set = AnimatorSet()
        val objX = ObjectAnimator.ofFloat(view, View.SCALE_X, 1.162f, 1f)
        val objY = ObjectAnimator.ofFloat(view, View.SCALE_Y, 1.162f, 1f)
        set.playTogether(objX, objY)
        set.start()
    }
    view?.invalidate()
}

标签: androidkotlinandroid-recyclerviewdrag-and-dropautoscroll

解决方案


推荐阅读