2012-02-29 186 views
3

我是新來的Android開發,並在那一刻,我必須做出的,其中控制手勢輸入的決定,但我只是不知道在哪裏搶觸摸輸入的利弊。我已經給了兩種選擇,你能向我解釋任何一種方式的優點和缺點嗎?我應該在哪裏實現Android onTouchListener?

上查看設置監聽;實現方法:

faceView.setOnTouchListener(new OnTouchListener(){ 
    public boolean onTouch(View arg0, MotionEvent arg1){ 
    return false; 
    } 
); 

或視圖中

覆蓋方法

public boolean onTouchEvent(MotionEvent event){ 
    return false; 
} 

回答

2

方法1:匿名內在類型。

faceView.setOnTouchListener(new OnTouchListener(){ 
    public boolean onTouch(View arg0, MotionEvent arg1){ 
    return false; 
    } 
); 

這是匿名的,因爲它是一個沒有名字的聲明。沒有OnTouchListener mytouch =,只有聲明new OnTouchListener()。這是內在的,因爲它在另一個類中,並且它是一個類型,因爲它是一個接口的實現。

OK,所以考慮到這一點。這種方法對於開發人員更方便。功能是孤立的(通常是通過聲明監聽),這很容易管理。但這種便利帶來了成本。假設你有十個onClickListeners按鈕。通過這種方法,每個新的匿名內部類型都會使垃圾收集隊列更快填滿。

但它有關係嗎?不是真的。如果您試圖從系統中獲得每微秒的性能,那麼一定不要使用這種方法。但通常情況下,這是可行的。

方法2:單繼承

public boolean onTouchEvent(MotionEvent event){ 
    return false; 
} 

假設你看了上面的,這種方法也有創造和清理成本要低得多。實例化只有1個額外的類,並且只有1個對象添加到GC隊列中。

這是我使用的方法,並用了一段時間。這也是我在Google的示例源代碼中看到的。

但它並不完美!的onTouchEvent實施會顯得如此:

public void onTouch(Event e){ 
if (e.equals(View1)){ 
}else if (e.equals(View2)){ 
}else if (e.equals(View 3)){ 
...} 

SO

老實說,這並不重要。如果您希望獲得最高的性能,請使用靜態的onTouchEvent偵聽器,並且您不必支付上述費用,但大多數情況下它們並不昂貴。

0

我會親自使用監聽器,只需使用在您的onCreate方法,應該對現在

0

被罰款在大多數情況下,你很可能會被使用setOnTouchListener因爲它提供了更大的靈活性,並遵循常規的Java模式。通常情況下,覆蓋的onTouchEvent將只用於將始終是一個視圖,並且不會改變touchevents內發生touchevents。您還必須定義View類來覆蓋onTouchEvent。當使用類似按鈕的東西時,必須實現自己的按鈕類才能處理單擊事件是沒有意義的!

faceView.setOnTouchListener

  • 允許輕鬆定製
  • 遵循普遍接受的java圖案

缺點

  • 可能導致如果行爲沒有改變,那麼不必要的設置者。

覆蓋的onTouchEvent 臨

  • 封裝在基類

缺點的功能

  • 不允許定製
相關問題