2013-05-19 2 views
0

안드로이드 drag and drop을 내 gridview에 적용하려고합니다. 그리드 어댑터의 각 뷰에 dragListener를 설정했습니다. 눈금이 스크롤 할 수있을만큼 길지 않거나 눈금의 첫 번째보기가 표시되는 한 스크롤 할 수있는 경우 완벽하게 작동합니다. 스크롤하면 정확한 위치가 아니라 많은보기가 맨 위에 표시되지 않기 때문에 위치를 아래로 이동합니다. 어댑터의 내부Android 끌어서 놓기 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 (동영상 설명에 소스 코드를 링크).