2010-07-02 24 views
1

我正在嘗試修改一些我在網上找到的代碼以滿足我的需求。它應該抓住一個MotionEvent(特別是一次投擲)並啓動一個單獨的活動。我是java新手,所以在理解代碼時遇到了一些麻煩。這是我到目前爲止有:在Android中處理用戶界面事件

public class Hypertension extends Activity { 
private GestureDetector flingDetector; 
View.OnTouchListener gestureListener; 
private TextView redView; 
private TextView greenView; 
    /** Called when the activity is first created. */ 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 

     redView = (TextView)findViewById(R.id.buttonRed); 
     greenView = (TextView)findViewById(R.id.buttonGreen); 

     redView.setOnTouchListener(gestureListener); 
     greenView.setOnTouchListener(gestureListener); 

     flingDetector = new GestureDetector(new MyFlingListener()); 
     gestureListener = new View.OnTouchListener() { 
      public boolean onTouch(View v, MotionEvent event) { 
       if (flingDetector.onTouchEvent(event)) { 
        //startActivity(new Intent(Hypertension.this, Green.class)); 
       return true; 
       } 
       return false; 
      } 
     }; 
    } 

    class MyFlingListener extends SimpleOnGestureListener { 
     @Override 
     public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, 
      float velocityY) { 
     // TODO Auto-generated method stub 
     startActivity(new Intent(Hypertension.this, Green.class)); 
     return false; 
     } 
    } 

    @Override 
    public boolean onTouchEvent(MotionEvent event) { 
     if (flingDetector.onTouchEvent(event)) 
     return true; 
    else 
     return false; 
    } 
} 

我的理解是,當屏幕被觸摸時的onTouchEvent被調用。在上面的代碼中,這個方法被覆蓋來調用flingDetector,它偵聽一個fling。如果有人聽到,它會啓動該活動。

但是,到現在爲止,當我在模擬器中執行一些操作時,什麼也沒有發生。另外,我對各種布爾方法實際表示的返回值相當困惑。

回答

2

在代碼中有兩個onTouchEvent方法。一個在GestureDetector類中(未覆蓋),另一個在Hypertension活動類(您已在底部覆蓋)。

當有人觸發的TouchEvent中的主要活動你顯式調用GestureDetector一個(傳下來的事件)這裏:

if (flingDetector.onTouchEvent(event)) return true; 

但是,如果你還沒有覆蓋該類的方法的onTouchEvent然後什麼都不是將要發生!


覆蓋這些「onSomething()」方法的目的是,這樣當事件觸發他們將得到自動調用。 一般與聽衆的工作方式如下:

  1. 的事件創建監聽器類的子類,並覆蓋其「的onEvent()」方法做一些事情時,該事件被觸發
  2. 調用「setListener(監聽)」的對象的方法要觸發後表示,這事件已初始化 - 傳遞先前創建的監聽
  3. 坐視:)
+0

非常感謝!我得到了它的工作。我簡化了我的應用程序,以響應點擊而不是手勢,並研究了它的語法如何適合您的三步過程。一旦我理解了這一點,這只是將它翻譯成滑動的問題。有沒有辦法將這個線程標記爲已解決? – dfetter88 2010-07-02 20:18:41

+0

太棒了!真高興你做到了!而且你已經將線程標記爲已解決:) – idolize 2010-07-04 18:33:03

0

對於返回布爾值的所有事件偵聽器,它在處理事件時應該返回true,所以在您的示例中,如果flingDetector處理onTouchEvent,它將返回true。

question已經提出過,並有一些很好的答案。

+0

我讀throught頁面,並注意到我錯過了d爲我的textviews定義了ontouchlistener。我已經更新了上面的代碼。但是,該應用程序仍然無法正常工作。 我認爲我的主要問題是我不明白這些方法是如何一起工作的。我最後的方法(onTouchEvent)究竟做了什麼?如果textview已經設置了觸摸處理程序,那麼在我看來這種方法是無用的。 – dfetter88 2010-07-02 17:55:54