У меня есть линейный макет, к которому я добавляю и изменяю несколько кнопок программно. Мне нужно, чтобы кнопки реагировали на onClick и могли перемещать их.
Код, который я использую, похоже, должен работать, но часто кнопка не реагирует на Action_Up, который выравнивает кнопку после перетаскивания, и иногда кнопка также «нажата», когда она должна только двигаться. Я создаю детектор жестов в onCreate,
gestureDetector = new GestureDetector(this, new SingleTapConfirm());
и onTouch во время настройки каждой кнопки
btn.setOnTouchListener(mover);
View.OnTouchListener mover = new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
// adds selected letter to answer (from onClickListener)
if (gestureDetector.onTouchEvent(event)) {
append(v);
// single tap
return true;
}
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
dX = v.getX() - event.getRawX();
dY = v.getY() - event.getRawY();
break;
case MotionEvent.ACTION_MOVE:
v.animate()
.x(event.getRawX() + dX)
.y(event.getRawY() + dY)
.setDuration(0)
.start();
break;
case MotionEvent.ACTION_UP:
case MotionEvent.ACTION_BUTTON_RELEASE:
Log.d("onTouch", "here");
Arrays.sort(buttons, new Comparator<Button>() {
@Override
public int compare(Button b1, Button b2) {
if (b1.getX() > b2.getX()) return 1;
else return -1;
}
});
StringBuilder sb = new StringBuilder();
for (int cl = 0; cl < 15; cl++)
sb.append(buttons[cl].getContentDescription());
Log.d("Buttonsb", sb.toString());
alignButtons(sb.toString());
default:
return false;
}
return true;
}
};
private class SingleTapConfirm extends GestureDetector.SimpleOnGestureListener {
@Override
public boolean onSingleTapUp(MotionEvent event) {
return true;
}
}