Bezdepbonusu7Программирование: статьи и ответы

Вопрос

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

Автор вопроса: TasDevОтветов: 1

Я бы хотел, чтобы пользователь моего 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. Есть предложения, почему?

androidcoordinatesdrag-and-droptouch-event

Ответы

Ответ 1 · Matt

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

Перевод вопроса и ответов сообщества Stack Overflow, лицензия CC BY-SA. Оригинал на Stack Overflow.

Похожие материалы