2010-05-13 85 views
3

我想設置一個響應onTouch的按鈕的GridView。例如,如果我將手指水平,垂直或對角地劃過屏幕,則需要選中觸摸的按鈕。我嘗試設置OnTouchListener的按鈕,但這不起作用,只有拖動事件中的第一個按鈕接收到onTouch事件。GridView onTouch

接下來我嘗試爲GridView創建一個OnTouchListener,然後使用X,Y座標確定觸摸哪個按鈕。這似乎不起作用,因爲如果我在GridView的邊緣開始拖動,MOTION_DOWN事件只傳遞給GridView的onTouch()。實際上,如果我在水平方向上拖動手指,除非在GridView邊緣開始拖動,否則onTouch事件根本不會被觸發。有誰知道更好的方法來做到這一點?

在此先感謝。

gridview.setOnTouchListener(new View.OnTouchListener() 
{ 
@Override 
public boolean onTouch(@SuppressWarnings("unused") View view, MotionEvent event) 
{ 
    float X = event.getX(); 
    float Y = event.getY(); 

    switch (event.getAction()) { 
    case MotionEvent.ACTION_DOWN: 
    System.out.println("Down: " + X + "," + Y); 
    break; 
    case MotionEvent.ACTION_MOVE: 
    System.out.println("Move: " + X + "," + Y); 
    break; 
    case MotionEvent.ACTION_UP: 
    System.out.println("Up: " + X + "," + Y); 
    break; 
    } 

    return true; 
} 
} 

回答

0

您可能想嘗試使用GestureDetector來觸發正確的觸摸事件。 從那裏開始,你應該能夠確定你做了什麼以及在哪裏。

GestureDetector會給你幾種告訴你你做了什麼的方法(SingleTapUp,Fling,Scroll,...)以及你在什麼位置和多長時間做了這個(如果你例如刷卡,你得到的起始位置,在刷卡的時間有多遠,你刷卡)

1

如果你有一個適配器實現一個接口來收聽點擊你的柵格單元的活動,例如:

public interface OnSaveEditsListener 
{ 
    public abstract void onSaveEdits(); 
} 

private OnSaveEditsListener saveEditsListener = null; 
public void setOnSaveEditsListener(OnSaveEditsListener l) { 
    saveEditsListener = l; 
} 

而且你應該在你的適配器getView實現(。 。)方法,特殊點擊監聽器:

 holder.gridcell.setOnClickListener(new OnClickListener() { 

      @Override 
      public void onClick(View v) { 
       CalendarPosition = position; 
       v.requestFocusFromTouch(); 

       try{ 
        saveEditsListener.onSaveEdits(); 
        holder.gridcell.invalidate(); 
       }catch(Exception ex){} 

      } 
     }); 

建議在適配器內部使用持有者來查看元素。

而最後一部分,從你的Activity類,只要致電:

adapter.setOnSaveEditsListener(new GridCellAdapter.OnSaveEditsListener() { 

     @Override 
     public void onSaveEdits() { 
      /** methods *// 
    }); 
} 
0

它是不完整的,但可以幫助ü

gridview.setOnTouchListener(new OnTouchListener(){ 
@Override 
public boolean onTouch(View v, MotionEvent event) { 

      if(event.getAction() == MotionEvent.ACTION_MOVE){ 
       gridview.requestFocusFromTouch(); 
       gridview.setSelection(gridview.pointToPosition((int)event.getX(),(int)event.getY())); 
       return true; 
      } 
      if(event.getAction() == MotionEvent.ACTION_UP){ 
       gridview.clearFocus(); 
       return true; 
      } 

      return false; 
     } 
    }); 
0

你是在正確的軌道上。您只需要使用onTouch中的X,Y座標來使用gridView的pointToPosition方法獲取網格單元的位置。然後,您可以使用位置(ID)使用getChildAt方法獲取單元格中的實際項目。例如,如果你的gridView在每個單元格中都有TextView,那麼使用這個

int position = gridView.pointToPosition((int) currentXPosition, (int) currentYPosition); 
TextView tv = (TextView) gridView.getChildAt(position);