Android - реализация перетаскивания между TextViews

Я бы хотел, чтобы пользователь моего Android-приложения мог перемещать содержимое одного TextView (A) в другой TextView (B). Они должны иметь возможность сделать это путем перетаскивания из A и отпускания через B. Я пытался добиться этого с помощью события onTouch, особенно ACTION_DOWN и ACTION_UP. Я думал, что это будет просто, но столкнулся с несколькими проблемами.

Попытка первая

Сначала я попытался захватить представление, передаваемое при каждом вызове обработчика событий. Это нормально для ACTION_DOWN, поскольку A передается как View. Однако в событии ACTION_UP A также передается как View, а не B.

Попытка вторая

Я фиксирую необработанные координаты события ACTION_UP (getRawX (), regRawY ()), а затем сравниваю эти координаты с левым, правым, верхним и нижним представлениями, на которые пользователь может «упасть». К сожалению, координаты просмотра не связаны с координатами события.

Вопрос

Как реализовать это простое перетаскивание или какую ошибку я делаю в своих двух попытках.

Код слушателя (вторая попытка)

OnTouchListener PlayerListener = new OnTouchListener () {
 public boolean onTouch(View v, MotionEvent me) {
  boolean mProcessed = false;
  int mActionX = 0;
  int mActionY = 0;
  int mAction = me.getAction();
  /* Determine gesture */
  switch (mAction) {
      case MotionEvent.ACTION_DOWN:
        mProcessed = theTeams.touchPlayer(v,mAction);
        break;
      case MotionEvent.ACTION_UP:
       mActionX = (int) me.getX();
       mActionY = (int) me.getY();
       mProcessed = theTeams.endTouch(v,mActionX,mActionY);
       break;

Код обработчика (вторая попытка)

  public boolean endTouch(View v, int dropX, int dropY) {
   int mLeft = 0;
   int mRight = 0;
   int mTop = 0;
   int mBottom = 0;
   boolean mFound = false;
   View mView = null;
   /* Find control at that position */
             mView = (TextView) findViewById(R.id.lCourt1ok);
   mLeft = mView.getLeft();
   mRight = mView.getRight();
   mTop = mView.getTop();
   mBottom = mView.getBottom();
   if ((dropX >= mLeft) && (dropX <= mRight ) 
                           && (dropY <= mBottom) && (dropY >= mTop))
    mFound = true;

Постскриптум

Что ж, в целом, с попыткой два все в порядке, когда я вычитаю 50 из координаты RawY. Есть предложения, почему?


person TasDev    schedule 23.12.2010    source источник


Ответы (1)


Что ж, в целом, с попыткой два все в порядке, когда я вычитаю 50 из координаты RawY. Есть предложения, почему?

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

person Matt    schedule 14.01.2011