如何在动态添加和修改的视图之间创建障碍

how to create barriers between dynamically added and modified views

提问人:doker797 提问时间:11/4/2023 更新时间:11/4/2023 访问量:30

问:

我以编程方式添加 View 对象,然后能够通过在布局中拖动它们来更改它们的 X 和 Y,但它们有一个问题,即一个对象可以超出另一个对象的边界。我需要它与另一种观点相对立,而不是超越它。怎么做? 这是我的代码:

    private fun drawobject(context: Context?) {
        val r: Resources = getResources()
        val px = TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_MM, 100F,
            r.getDisplayMetrics()).toInt() // Convert mm to px
        val objectconteiner: LinearLayout = requireView().findViewById(R.id.progressBar_container)
        var ViewLayoutParams: ViewGroup.LayoutParams = ViewGroup.LayoutParams(
            100, 20)
        var imageView:View = View(context)
        imageView.setLayoutParams(ViewLayoutParams)
        imageView.setBackgroundColor(Color.RED)
        var initialX:Float? = null
        var initialY:Float? = null
        var initialTouchX:Float? = null
        var initialTouchY:Float? = null

        imageView.setOnTouchListener { v, event ->

            when (event.action) {
                MotionEvent.ACTION_DOWN -> {
                    initialX = event!!.getX()
                    initialY = event!!.getY()
                    imageView.setBackgroundColor(Color.BLACK)
                    //Log.e("211", "$initialX")

                }

                MotionEvent.ACTION_MOVE -> {
                    binding.Hsc.setSwipeable(false) //ban on scrollview movement
                    binding.Vsc.setSwipeable(false) 
                    initialTouchX = (event!!.getX() - initialX!!)
                    initialTouchY = (event!!.getY() - initialY!!)

                    var actualX = imageView.x + initialTouchX!!
                    var actualY = imageView.y + initialTouchY!!
                    imageView.setX(actualX!!)
                    imageView.setY(actualY!!)
                    //Log.e("2", "$px")
                    //Log.e("2", "$actualX") 
                }

                MotionEvent.ACTION_UP -> {
                    //Log.e("2", "gh")
                    binding.Hsc.setSwipeable(true)
                    binding.Vsc.setSwipeable(true)
                }

            }
            true

            }

        imageView.setBackgroundColor(Color.RED)
        objectconteiner.addView(imageView)

    }

视图在 LinearLayout、XMl 中加载:

   <LinearLayout
       android:orientation="horizontal"
       android:id="@+id/progressBar_container"
       android:layout_width="100mm"
       android:layout_height="100sp"
       android:layout_marginTop="100sp"
       android:layout_marginLeft="100sp"
       android:background="@color/back">
   </LinearLayout>

据我了解,您需要在设置X,Y时设置限制,但是如何获取另一个对象的X和Y边界。我用 Kotlin 写作,但我也懂 java,如果你知道如何解决这个问题,请回答 java 或 kotlin。

java android kotlin 边框

评论

0赞 marcinj 11/4/2023
你不希望你的 ImageView 超出 LinearLayout?你已经引用了它:objectconteiner,所以取它的位置x,y,宽度和高度,并在调用setX和setY之前更新actualX和actualY。
0赞 doker797 11/5/2023
在没有任何条件的情况下,这也是,但最大的问题是为两个或多个添加的视图创建边框,函数本身在按下按钮时绘制一个视图,当添加 2 个或更多视图并拖动它们时,您可以允许一个与另一个表面重叠,如何摆脱这一点?
0赞 doker797 11/5/2023
据我了解,我将需要创建一个函数来计算其他元素的所有边界并将它们与正在移动的元素的边界进行比较,从而创建一个遍历已添加对象的循环(因为添加没有限制),但也许有一种我不知道的更简单的方法?

答: 暂无答案