У меня есть 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
на основе движения пальца.