2012-02-11 6 views
0

私はアプリケーションの種類を開発しようとしています。私は、アイコンを描画するためにアダプタとグリッドビューを使用します。私はdrap &ドロップを実装したいので、他の要素でうまく動作するontouchlistenerを書きましたが、グリッドビューのアイコンに問題があります。GridView要素のOnTouchListener

アイコンを長押しすると、水平にドラッグしますが、モーションイベントがMotionEvent.ACTION_CANCELに与えるよりも垂直方向のピクセルの場合のみ、ドラッグが停止し、gridviewがスクロールし始めます。 どうすればそれを避けることができますか?私はグリッドビューをスクロール不能にするためにgridview.setEnable(false)を試しましたが、ドラッグは以前と同じように停止します。

誰かが私を助けてくれますか?それはあなたがすべてのMotionEvent.ACTION_DOWNまたはMotionEvent.ACTION_MOVE時のビューの親にrequestDisallowInterceptTouchEvent()を呼び出すようにしてください...

@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

を助けることができる場合はここでいくつかのコード。

このコードは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); 
    } 
} 
関連する問題