Android: эффект разрыва при вызове requestLayout () в методах OnTouchListener?способ исправить? - PullRequest
0 голосов
/ 04 апреля 2011

Я попытался добавить механизм Drag & Drop в свой проект. То, как я это делаю, - это в основном выполнение двух операций каждый раз, когда происходит событие касания:
сначала обновляю параметры, которые я использую внутри onLayout () в соответствии с событием касания
секунда, вызывая requestLayout () для обновления.
(я пробовал это как с методами OnTouchListener, так и с OnTouchEvent () в View, как в следующем коде)

Проблема в том, что результат на экране был не очень хорошим. это создавало ощущение, будто существует некоторая разрывная проблема с перетаскиваемым видом (новый чертеж начинается раньше, чем заканчивается)

код выглядит примерно так (упрощенная версия):

public class DragAndDrop extends ViewGroup
{
  View touchView;
  float touchX;
  float touchY;

  static int W = 180;
  static int H = 120;

  public DragAndDrop(Context context)
  {
    super(context);

    touchView = new View(context);
    touchView.setBackgroundColor(0xaaff9900);
    addView(touchView);
  }

  @Override
  protected void onLayout(boolean changed, int l, int t, int r, int b)
  {
    float width = r - l;
    float height = b - t;

    int centerX = (int) (touchX - W / 2);
    int centerY = (int) (touchY - H / 2);

    touchView.layout(centerX, centerY, centerX + W, centerY + H);
  }

  @Override
  public boolean onTouchEvent(MotionEvent event)
  {
    touchX = event.getX();
    touchY = event.getY();

    requestLayout();
    return true;
  }
}

после исследования я обнаружил, что проблема заключается в вызове requestLayout () метода внутри методов touchListener.
Я перевел этот вызов на таймер, который периодически его срабатывал, и результат был намного лучше.

Кто-нибудь еще испытывал это и знает, как лучше это сделать, не используя таймер?
Я предпочитаю избегать обновления все время больше, чем необходимо.

Спасибо за вашу помощь!

1 Ответ

0 голосов
/ 13 марта 2012

Я думаю, вы говорите, что ваша полная версия включает в себя создание подкласса View и переопределение onTouchEvent(), и в этом случае см. этот ответ . С event.getX() и event.getY() в моей собственной аналогичной реализации перетаскивания я видел события перемещения, которые, казалось, показывали, как мое касание колеблется вокруг моего пальца при его движении; с event.getRawX() и event.getRawY() движение было плавным, как мое истинное движение пальца.

Кроме того, с необработанными координатами, вероятно, также лучше сохранить координаты события ACTION_DOWN, а затем пересчитать относительное расстояние и requestLayout() каждый раз, когда вы получаете событие ACTION_MOVE.

...