Android перетащить вид гладкой - PullRequest
15 голосов
/ 16 декабря 2011

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

Ответы [ 5 ]

22 голосов
/ 08 апреля 2013

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

4 голосов
/ 02 апреля 2016

Вам не нужно использовать 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;
  }
1 голос
/ 08 октября 2012

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

0 голосов
/ 09 июня 2013

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

0 голосов
/ 16 декабря 2011

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

...