Ответ 1
Попробуйте использовать motionEvent.getRawX() и motionEvent.getRawY() вместо getY и getX
Мне нужно перетащить некоторые виды на экран. Я изменяю их положение, изменяя влево и сверху их параметры макета из события движения на ACTION_MOVE из прослушивателя касания. Есть ли способ "перетащить" предметы более гладко? Потому что это "перетаскивание" не совсем гладко... Вот код
public boolean onTouch(View view, MotionEvent motionEvent) {
switch (motionEvent.getAction()) {
case MotionEvent.ACTION_DOWN:
dx = (int) motionEvent.getX();
dy = (int) motionEvent.getY();
break;
case MotionEvent.ACTION_MOVE:
int x = (int) motionEvent.getX();
int y = (int) motionEvent.getY();
RelativeLayout.LayoutParams lp = (RelativeLayout.LayoutParams) view.getLayoutParams();
int left = lp.leftMargin + (x - dx);
int top = lp.topMargin + (y - dy);
lp.leftMargin = left;
lp.topMargin = top;
view.setLayoutParams(lp);
break;
}
return true;
}
Попробуйте использовать motionEvent.getRawX() и motionEvent.getRawY() вместо getY и getX
Вам не нужно использовать LayoutParameters для перетаскивания. Вы можете сделать это, просто установив координаты X и Y вида. Подробнее об этом можно прочитать здесь.
Вы можете сделать что-то вроде этого.
@Override
public boolean onTouch(View view, MotionEvent event) {
switch (event.getActionMasked()) {
case MotionEvent.ACTION_DOWN:
dX = view.getX() - event.getRawX();
dY = view.getY() - event.getRawY();
break;
case MotionEvent.ACTION_MOVE:
view.setY(event.getRawY() + dY);
view.setX(event.getRawX() + dX);
break;
default:
return false;
}
return true;
}
Причиной негладкого перемещения является целое значение leftMargin и topMargin.
Для плавного перемещения позиция должна быть плавающей.
Это может помочь.
Было бы полезно посмотреть, как вы обрабатываете события ACTION_MOVE. Используете ли вы все точки, используя метод event.getHistorical()? Если это не даст вам более плавное перетаскивание, другой идеей может быть интерполяция точек на пути. Я считаю, что будет достигнута компромисс между достижением гладкости движения и быстрым реагированием на пользовательский прикосновение. НТН.
Вы должны объединить свои функции, а также использовать поля не будут очень гладкими, используйте другой макет и задайте координаты X и Y в соответствии с размерами экрана.