Изображение

Мне нужно перетащить некоторые виды на экран. Я изменяю их положение, изменяя влево и сверху их параметры макета из события движения на 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;
}

Ответы

Ответ 1

Попробуйте использовать motionEvent.getRawX() и motionEvent.getRawY() вместо getY и getX

Ответ 2

Вам не нужно использовать 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;
  }

Ответ 3

Причиной негладкого перемещения является целое значение leftMargin и topMargin.
Для плавного перемещения позиция должна быть плавающей.
Это может помочь.

Ответ 4

Было бы полезно посмотреть, как вы обрабатываете события ACTION_MOVE. Используете ли вы все точки, используя метод event.getHistorical()? Если это не даст вам более плавное перетаскивание, другой идеей может быть интерполяция точек на пути. Я считаю, что будет достигнута компромисс между достижением гладкости движения и быстрым реагированием на пользовательский прикосновение. НТН.

Ответ 5

Вы должны объединить свои функции, а также использовать поля не будут очень гладкими, используйте другой макет и задайте координаты X и Y в соответствии с размерами экрана.