微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决使用相同的 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 举报,一经查实,本站将立刻删除。