使用相同的 OnTouchEvent 与另一个视图同步移动视图

问题描述

我在一个屏幕上有 2 个视图。我想设置一些东西,以便我可以选择 1 个视图并选择两个视图,从而允许将两个视图拖动到另一个位置。它们彼此相关的位置将保持不变(例如,如果它们在 x 轴上彼此相距 100dp,如果它们被拖动 x 25dp 和 y 100dp,它们将保持相距 100dp,但在它们的新位置上)。
我试图用测试代码来做到这一点,但是每当我尝试共享触摸事件(我将 dispatchTouchEvent 方法调用到另一个视图)时,另一个视图会移动到相同的触摸区域,因此现在看起来只有 1 个视图可用。
我将不胜感激,人们可以就此向我提出建议,因为我不确定我是否做错了什么,或者我是否遗漏了编码中的一个步骤。

class TouchTesting3Fragment: Fragment()
{
    lateinit var mBinding: FragmentTouchtesting3Binding

    override fun onCreate(savedInstanceState: Bundle?)
    {
        super.onCreate(savedInstanceState)
    }

    override fun onCreateView(
        inflater: LayoutInflater,container: ViewGroup?,savedInstanceState: Bundle?
    ): View?
    {
        mBinding = FragmentTouchtesting3Binding.inflate(inflater,container,false)
        return mBinding.root
    }

    override fun onViewCreated(view: View,savedInstanceState: Bundle?)
    {
        super.onViewCreated(view,savedInstanceState)

        val onTouchListener = object : View.OnTouchListener
        {
            override fun onTouch(view: View?,event: MotionEvent?): Boolean
            {
                if (view != null && event != null && event.action == MotionEvent.ACTION_DOWN)
                {
                    var viewToSend = view
                    val clipText = viewToSend.getTag(R.id.tag_MetaItem).toString()
                    val item = ClipData.Item(clipText)
                    val mimeTypes = arrayOf(ClipDescription.MIMETYPE_TEXT_PLAIN)
                    val dragData = ClipData(clipText,mimeTypes,item)

                    val myShadow = View.DragShadowBuilder(viewToSend)
                    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N)
                    {
                        viewToSend.startDragAndDrop(dragData,myShadow,viewToSend,0)
                    }
                    else
                    {
                        viewToSend.startDrag(dragData,0)
                    }
                    viewToSend.visibility = View.INVISIBLE
                    if (view.id == mBinding.dragview.id)
                    {
                        mBinding.dragview2.dispatchTouchEvent(event)
                    }
                }
                return true
            }
        }
        mBinding.dragview.setTag(R.id.tag_MetaItem,"This is your cliptext for One")
        mBinding.dragview.setonTouchListener(onTouchListener)
        mBinding.dragview2.setTag(R.id.tag_MetaItem,"This is your cliptext for Two")
        mBinding.dragview2.setonTouchListener(onTouchListener)

        val onDragListener = object : View.OnDragListener
        {
            override fun onDrag(view: View?,event: DragEvent?): Boolean
            {
                when (event!!.action)
                {
                    DragEvent.ACTION_DRAG_STARTED ->
                    {
                        return event.clipDescription.hasMimeType(ClipDescription.MIMETYPE_TEXT_PLAIN)
                    }
                    DragEvent.ACTION_DRAG_ENTERED ->
                    {
                        view!!.invalidate()
                        return true
                    }
                    DragEvent.ACTION_DRAG_LOCATION ->
                    {
                        return true
                    }
                    DragEvent.ACTION_DRAG_EXITED ->
                    {
                        view!!.invalidate()
                        return true
                    }
                    DragEvent.ACTION_DROP ->
                    {
                        val item = event.clipData.getItemAt(0)
                        val dragData = item.text
                        Toast.makeText(requireContext(),dragData.toString(),Toast.LENGTH_SHORT).show()

                        val v = event.localState as View
                        val owner = v.parent as ViewGroup
                        owner.removeView(v)

                        val destination = view as LinearLayout
                        destination.addView(v)
                        v.visibility = View.VISIBLE
                        return true
                    }
                    DragEvent.ACTION_DRAG_ENDED -> {
                        view!!.invalidate()
                        return true
                    }
                    else ->
                    {

                    }
                }
                return true
            }
        }
        mBinding.lltop.setonDragListener(onDragListener)
        mBinding.llbottom.setonDragListener(onDragListener)
    }
}

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)