2013-05-19 115 views
0

我試圖在我的gridview上阻止Androids drag and drop。我爲網格適配器中的每個視圖設置了一個dragListener。當網格不夠長或不可滾動時,或者只要網格中的第一個視圖可見時,它就可以滾動。滾動時,它將動作向下移動一個位置,因爲許多視圖在頂部不可見,而不在正確的位置。適配器的內部Android Drag and Drop GridView

GridView控件集DragListener:

ImageView i = new ImageView; 
i.setImageResource(ImageList.get(position)); 
i.setOnDragListener(new MyDragImageListener(position)); 
return i; 

MyDragListener:

public class MyDragImageListener implements OnDragListener{ 

    int imagePosition; 

    public MyDragImageListener(int position) { 
     imagePosition = position; 
    } 

    @Override 
    public boolean onDrag(View v, DragEvent event) { 
     switch (event.getAction()) { 
     case DragEvent.ACTION_DRAG_STARTED: 
      Log.i("DRAG Started", "" + imagePosition); 
      break; 
     case DragEvent.ACTION_DRAG_ENTERED: 
      Log.i("DRAG Entered", "" + imagePosition); 
      ImageView imageEnter = (ImageView) Grid.getChildAt(imagePosition); 
      imageEnter.setBackgroundColor(Color.argb(155, 100, 200, 255)); 
      break; 
     case DragEvent.ACTION_DRAG_EXITED:   
      Log.i("DRAG Exited", "" + imagePosition); 
      ImageView imageExit = (ImageView) Grid.getChildAt(imagePosition); 
      imageExit.setBackgroundColor(Color.argb(0, 0, 0, 0)); 
      break; 
     case DragEvent.ACTION_DROP: 
      Log.i("DRAG Dropped", "" + imagePosition); 

      break; 
     case DragEvent.ACTION_DRAG_ENDED: 
      Log.i("DRAG Ended", "" + imagePosition); 
      default: 
      break; 
     } 
     return true; 
    } 

} 
+1

你想說DragEvent正在返回screenPosition,你期望絕對位置或其他方式?爲什麼你不只是獲得滾動位置,並使用它作爲抵消 –

+0

謝謝我試過這個,它看起來像它的工作。我剛開始使用拖放,並認爲這將是一個更復雜的解決方案,從來沒有想過嘗試。 – cange1

回答

0

你是如何處理的觸摸事件?有在一個位置提供所有的觸摸動作之間薄平衡:

@Override 
public boolean onInterceptTouchEvent(MotionEvent ev) { 
    if (mDragController == null || !mDragging) { 
     if (mDragController!=null) mDragController.onInterceptTouchEvent(ev); 
     if (mSwipeEnabled) { 
      gestureDetector.onTouchEvent(ev); 
      return false; //to make sure we receive further messages 
     } 
     else 
      return super.onInterceptTouchEvent(ev); //for scroll, etc 
    } 
    else 
    // controller to handle event 
    return mDragController.onInterceptTouchEvent(ev); 
} 

/** 
* 
*/ 
@Override 
public boolean onTouchEvent(MotionEvent ev) { 
    if (mDragController == null || !mDragging) { 
     //if (!gestureDetector.onTouchEvent(ev)) 
      return super.onTouchEvent(ev); 
    } 
    // controller to handle event 
    return mDragController.onTouchEvent(ev); 
} 

這個偉大工程,提供本演示視頻中所示的結果:http://www.youtube.com/watch?v=m4yktX3SWSs(在視頻描述源代碼的鏈接)。