2012-02-11 20 views
0

我正在嘗試開發一種應用程序抽屜。我使用帶有適配器的gridview來繪製圖標。我想實現drap &放在他們上面,所以我寫了一個ontouchlistener,在其他元素上工作正常,但在gridview中的圖標有一些問題...GridView元素上的OnTouchListener

當我長按一個圖標,我可以將其水平拖拽,但僅限垂直於像素的某個像素,而不是MotionEvent.ACTION_CANCEL,拖動停止並且網格視圖開始滾動。 我該如何避免它?我tryed gridview.setEnable(false),爲了使不可滾動的gridview,但拖動停止像以前一樣..

有人可以幫助我嗎?這裏是一些代碼,如果它可以幫助...

@Override 
public boolean onTouch(View view, MotionEvent me) { 
    int action = me.getAction(); 

    switch(action){ 

    case MotionEvent.ACTION_DOWN: 
     status = START_DRAGGING; 
     params = new RelativeLayout.LayoutParams(dim,dim); 
     params.leftMargin=(int) me.getRawX()-60; 
     params.topMargin= (int) me.getRawY()-90; 
     parenty=bglayout.getHeight(); 
     view.setDrawingCacheEnabled(true); 
     image.setImageBitmap(view.getDrawingCache()); 
     bglayout.addView(image, params); 
     grview.setOnItemSelectedListener(null); 
     break; 
    case MotionEvent.ACTION_CANCEL: 
    case MotionEvent.ACTION_UP: 
     status = STOP_DRAGGING; 
     Log.v("Drag", "Stopped Dragging"); 
     bglayout.removeView(image); 
     break; 

    case MotionEvent.ACTION_MOVE: 
      if (status == START_DRAGGING) { 
       System.out.println("Dragging"); 
       params = new RelativeLayout.LayoutParams(dim,dim); 
       params.leftMargin= (int) Math.min(me.getRawX()-dim/2, bglayout.getWidth()-dim) ; 
       params.topMargin= (int) Math.min(me.getRawY()-dim/2, bglayout.getHeight()-dim) ; 
       Log.v("DRAG", params.leftMargin + " " + params.topMargin); 
       image.setLayoutParams(params); 
       image.invalidate(); 

      } 
     } 
     return false; 
    } 

回答

1

你應該嘗試每MotionEvent.ACTION_DOWN或MotionEvent.ACTION_MOVE期間對視圖的父級調用requestDisallowInterceptTouchEvent()。

此代碼從android.widget.SeekBar提取:

@Override 
public boolean onTouchEvent(MotionEvent event) { 
    switch (event.getAction()) { 
     case MotionEvent.ACTION_DOWN: 
      attemptClaimDrag(); 
      break; 

     case MotionEvent.ACTION_MOVE: 
      attemptClaimDrag(); 
      break; 
    } 
    return super.onTouchEvent(event); 
} 


private void attemptClaimDrag() { 
    ViewParent parent = getParent(); 
    if (parent != null) { 
     parent.requestDisallowInterceptTouchEvent(true); 
    } 
}