Перемещение представления на ConstraintLayout с помощью DragEvents - PullRequest
0 голосов
/ 03 апреля 2020

У меня есть Button, который я хотел передвигать с некоторыми DragEvent с. Вот мой код:

/** [View.OnDragListener] interface */
    override fun onDrag(view: View?, dragEvent: DragEvent?): Boolean {
        // just like in the onTouchListener we have a bunch of events for dragging
        Log.d("GestureDetector", "onDrag() is called.")

        var x_cord = 0f
        var y_cord = 0f

        when (dragEvent?.action) {

            DragEvent.ACTION_DRAG_STARTED -> {
                Log.d("GestureDetector", "onDrag: drag started.")
                return true
            }
            DragEvent.ACTION_DRAG_ENTERED -> {
                Log.d("GestureDetector", "onDrag: drag entered.")
                x_cord = dragEvent.x
                y_cord = dragEvent.y
                return true
            }
            DragEvent.ACTION_DRAG_LOCATION -> {
                Log.d(
                    "GestureDetector",
                    "onDrag: current point: ( " + dragEvent.x.toString() + " , " + dragEvent.y.toString() + " )"
                )
                x_cord = dragEvent.x
                y_cord = dragEvent.y

                return true
            }
            DragEvent.ACTION_DRAG_EXITED -> {
                Log.d("GestureDetector", "onDrag: exited.")
                x_cord = dragEvent.x
                y_cord = dragEvent.y

                set.setTranslation(button.id, x_cord, y_cord)
                set.applyTo(binding.constraintLayout)
                return true
            }
            DragEvent.ACTION_DROP -> {
                Log.d("GestureDetector", "onDrag: dropped.")

                return true
            }
            DragEvent.ACTION_DRAG_ENDED -> {
                Log.d("GestureDetector", "onDrag: ended.")
                return true
            }
            else -> Log.e(
                "GestureDetector",
                "Unknown action type received by OnStartDragListener."
            )
        }
        return false
    }

Как видите, я попытался отследить координаты x и y, чтобы применить новую позицию Button к ConstraintLayout в DragEvent.ACTION_DRAG_EXITED. Я не знал, как это сделать, так как официальные документы не помогают и все бывшие. Я обнаружил, что в дикой природе используют RelativeLayout.

Ради полноты: я начинаю операцию перетаскивания в методе onLongPress() метода GestureDetector.OnGestureListener следующим образом:

override fun onLongPress(p0: MotionEvent?) {
        Log.d("GestureDetector", "onLongPress() is called.")

        val builder : View.DragShadowBuilder = View.DragShadowBuilder(button)
        button.startDragAndDrop(null, builder, null, 0)
        builder.view.setOnDragListener(this)
    }

И Button создается динамически во время выполнения и позиционируется с использованием ConstraintSet, например, в методе onCreate():

override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        binding = DataBindingUtil.setContentView(this, R.layout.activity_main)

        button = Button(this)
        button.text = getString(R.string.hello)
        button.id = R.id.myTextView

        button.setOnTouchListener(this)
        binding.constraintLayout.addView(button)

        set = ConstraintSet()
        set.constrainHeight(button.id, ConstraintSet.WRAP_CONTENT)
        set.constrainWidth(button.id, ConstraintSet.WRAP_CONTENT)

        set.connect(
            button.id,
            ConstraintSet.LEFT,
            ConstraintSet.PARENT_ID,
            ConstraintSet.LEFT, 0)

        set.connect(
            button.id,
            ConstraintSet.RIGHT,
            ConstraintSet.PARENT_ID,
            ConstraintSet.RIGHT, 0)

        set.connect(
            button.id,
            ConstraintSet.TOP,
            ConstraintSet.PARENT_ID,
            ConstraintSet.TOP, 0)

        set.connect(
            button.id,
            ConstraintSet.BOTTOM,
            ConstraintSet.PARENT_ID,
            ConstraintSet.BOTTOM, 0)

        set.applyTo(binding.constraintLayout)

        gestureDetector = GestureDetector(this, this)

    }

Создание кнопки и DragEvents с операция перетаскивания теней все в порядке, НО я не могу изменить Button на основе движения пальца.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...