问题描述
我在一个屏幕上有 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 (将#修改为@)