2014-09-18 2 views
0

У меня есть gridview, что мне нужно реализовать функцию перетаскивания. Я пытался найти возможное решение или существующую библиотеку, которая бы соответствовала моей проблеме, но все равно не повезло.Android GridView Custom Drag and Drop [Обновлено]

Вот до и после того, как иллюстрация перетаскивания, что мне нужно реализовать:

enter image description here

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

Теперь, когда плитка A перетаскивается на 3-й ряд, как вы можете видеть, они идут бок о бок, а не меняются местами, даже если положить поверх плитки C. Количество белых плиток зависит от количества синие плитки на строку, каждому из них присваивается аррайалист, поэтому он будет просто следовать. Моя реальная проблема заключается в том, что все примеры перетаскивания gridview - это то, что черепица сворачивает или вся сетка следует за потоком элементов.

Мой план для реализации этого:

  1. Когда долго давил на плитку, чтобы быть втянуты, он будет показывать плитку, которая выглядит как эта плитка, только большую и меньшую непрозрачность.
  2. При опускании на определенное место вычисляется строка.
  3. Отрегулируйте параметры arraylists и notifydatassetanged.

Вот разбив проблему немного меньшие проблемы:

  1. Как я могу сделать большую плитку длинной прессованной плитки?
  2. Возможно ли получить положение, в котором сбрасывается увеличенная плитка?

Надеюсь, я объяснил это достаточно четко. Огромное спасибо.

ответ

0

Я закончил редактирование http://code.google.com/p/android-gridview-drag-and-drop/, чтобы соответствовать моей проблеме.

+0

Вам необходимо добавить хотя бы некоторые сведения о решении.В противном случае, если эта ссылка сломается в будущем, ответ будет полностью потерян. – Zanon

0

Когда вы бросаете плитку A, вы вычисляете, где теперь находится плитка A, если над плитой C, затем запустите анимацию (C переместитесь в сторону, а A - в положение C) и обновите конец Адаптера анимации.

3

1. Как я могу сделать большую черепицу длинной прессованной плитки? Да, вы можете получить представление о плитке и создать новый растровый рисунок, добавить растровое изображение в Windows. Подобно этому: класс расширяет GridView.

public boolean setOnItemLongClickListener(final MotionEvent ev) 
{ 
    this.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() 
    { 
     @Override 
     public boolean onItemLongClick(AdapterView<?> arg0, View arg1, 
       int arg2, long arg3) 
     { 
      // onInterceptTouchEvent(ev); 
      // TODO Auto-generated method stub 
      L.l("============on Long Click========="); 
      L.l("============X:" + ev.getX() + " Y:" + ev.getY()); 

      int x = (int) ev.getX(); 
      int y = (int) ev.getY(); 
      dragPosition = dropPosition = pointToPosition(x, y); 
      System.out.println(dragPosition); 
      if (dragPosition == AdapterView.INVALID_POSITION) 
      { 

      } 
      ViewGroup itemView = (ViewGroup) getChildAt(dragPosition 
        - getFirstVisiblePosition()); 

      dragPointX = x - itemView.getLeft(); 
      dragPointY = y - itemView.getTop(); 

      dragOffsetX = (int) (ev.getRawX() - x); 
      dragOffsetY = (int) (ev.getRawY() - y); 

      itemHeight=itemView.getHeight(); 

      L.l("========================y:" + y + " getRawY:" 
        + ev.getRawY()); 


      itemView.destroyDrawingCache(); 
      itemView.setDrawingCacheEnabled(true); 
      Bitmap bm = Bitmap.createBitmap(itemView.getDrawingCache()); 

      startDrag(bm, x, y); 
      return false; 
     }; 
    }); 
    return super.onInterceptTouchEvent(ev); 
} 

    private void startDrag(Bitmap bm, int x, int y) 
{ 

    windowParams = new WindowManager.LayoutParams(); 
    windowParams.gravity = Gravity.TOP | Gravity.LEFT;// 这个必须加 
    windowParams.x = x - dragPointX + dragOffsetX; 
    windowParams.y = y - dragPointY + dragOffsetY; 

    windowParams.height = WindowManager.LayoutParams.WRAP_CONTENT; 
    windowParams.width = WindowManager.LayoutParams.WRAP_CONTENT; 
    windowParams.flags = WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE 
      | WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE 
      | WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON 
      | WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN; 

    windowParams.format = PixelFormat.TRANSLUCENT; 
    windowParams.windowAnimations = 0; 

    ImageView iv = new ImageView(getContext()); 
    iv.setImageBitmap(bm); 
    windowManager = (WindowManager) getContext().getSystemService(
      Context.WINDOW_SERVICE);// "window" 
    windowManager.addView(iv, windowParams); 
    dragImageView = iv; 
} 


    @Override 
public boolean onTouchEvent(MotionEvent ev) 
{ 
    if (dragImageView != null 
      && dragPosition != AdapterView.INVALID_POSITION) 
    { 
     int x = (int) ev.getX(); 
     int y = (int) ev.getY(); 
     switch (ev.getAction()) 
     { 
      case MotionEvent.ACTION_MOVE: 
       onDrag(x, y); 
       break; 
      case MotionEvent.ACTION_UP: 
       stopDrag(); 
       onDrop(x, y); 
       break; 
     } 
    } 
    return super.onTouchEvent(ev); 
} 

private void onDrag(int x, int y) 
{ 
    if (dragImageView != null) 
    { 
     windowParams.alpha = 0.6f; 
     windowParams.x = x - dragPointX + dragOffsetX; 
     windowParams.y = y - dragPointY + dragOffsetY; 
     // L.l("=================windowParams.y=====000========"+windowParams.y); 
     windowManager.updateViewLayout(dragImageView, windowParams); 
    } 

    int tempScrollX = x - dragPointX + dragOffsetX; 
    int tempScrollY = y - dragPointY + dragOffsetY; 

    if (tempScrollY +itemHeight> 600) 
    { 
     this.scrollTo(0, tempScrollY); 
    } 
    else 
     if (pointToPosition(x, y) > 2) 
     { 

      this.scrollTo(0, tempScrollY - 300); 
     } 

} 

2.Is можно получить позицию, где упал увеличенная плитка? Если ваш класс расширяет GridView или AbsListView, этот API `pointToPosition (x, y) вернет позицию всего представления.

+0

Можете ли вы дать мне пример реализации на этом, пожалуйста? –

+0

Ваш адрес электронной почты? – theodore

+0

[email protected] –