這一期主要集中學習了的事件處理相關內容。主要參考內容為:
事件處理
核心技術與實例詳解—事件處理
的窗口機制分析------事件處理(該文屬于源碼分析級別,比較難,沒完全看懂)
開發指南-用戶界面-事件處理
目的:通過全面的分析的鼠標和鍵盤事件。了解中如何接收和處理鍵盤和鼠標事件,以及如何用代碼來產生事件。
主要學習內容:
1). 接收并處理鼠標事件:按下、彈起、移動、雙擊、長按、滑動、滾動
2). 接收并處理按鍵事件:按下、彈起
3). 模擬鼠標/按鍵事件
1. 事件
現代的用戶界面,都是以事件來驅動的來實現人機交換的,而上的一套UI控件,無非就是派發鼠標和鍵盤事件,然后每個控件收到相應的事件之后,做相應的處理。如控件,就只需要處理Down、move、up這幾個事件,Down的時候重繪控件,move的時候一般也需要重繪控件android 模擬長按事件,當up的時候,重繪控件,然后產生事件。在中通過實現接口的方法來實現對控件的處理。
對于觸摸屏事件(鼠標事件)有按下有:按下、彈起、移動、雙擊、長按、滑動、滾動。按下、彈起、移動(down、move、up)是簡單的觸摸屏事件,而雙擊、長按、滑動、滾動需要根據運動的軌跡來做識別的。在中有專門的類去識別,.view.。
對于按鍵(),無非就是按下、彈起、長按等。
2. 事件處理
手機的坐標系是以左上定點為原點坐標(0,0), 向右為X抽正方形,向下為Y抽正方向。
平臺的事件處理機制有兩種:一種是基于回調的,一種基于事件監聽的。當然還有更復雜的手勢判別。
3.事件偵聽器Event
事件偵聽器是視圖View類的接口,包含一個單獨的回調方法。這些方法將在視圖中注冊的偵聽器被用戶界面操作觸發時由框架調用。下面這些回調方法被包含在事件偵聽器接口中:
()
包含于View.。當用戶觸摸這個item(在觸摸模式下),或者通過瀏覽鍵或跟蹤球聚焦在這個item上,然后按下“確認”鍵或者按下跟蹤球時被調用。
()
包含于View.。當用戶觸摸并控制住這個item(在觸摸模式下),或者通過瀏覽鍵或跟蹤球聚焦在這個item上,然后保持按下“確認”鍵或者按下跟蹤球(一秒鐘)時被調用。
()
包含于View.r。當用戶使用瀏覽鍵或跟蹤球瀏覽進入或離開這個item時被調用。
onKey()
包含于View.。當用戶聚焦在這個item上并按下或釋放設備上的一個按鍵時被調用。
()
包含于View.。當用戶執行的動作被當做一個觸摸事件時被調用,包括按下,釋放,或者屏幕上任何的移動手勢(在這個item的邊界內)。
()
包含于View.。當正在創建一個上下文菜單的時候被調用(作為持續的“長點擊”動作的結果)。參閱創建菜單 Menus章節以獲取更多信息。
這些方法是它們相應接口的唯一“住戶”。要定義這些方法并處理你的事件,在你的活動中實現這個嵌套接口或定義它為一個匿名類。然后,傳遞你的實現的一個實例給各自的View.set...() 方法。(比如,調用()并傳遞給它你的實現。)
注意上面提到的()回調沒有返回值,但是一些其它事件偵聽器必須返回一個布爾值。原因和事件相關。對于其中一些,原因如下:
1) () – 返回一個布爾值來指示你是否已經消費了這個事件而不應該再進一步處理它。也就是說,返回true 表示你已經處理了這個事件而且到此為止;返回false 表示你還沒有處理它和/或這個事件應該繼續交給其他on-click偵聽器。
2) onKey() –返回一個布爾值來指示你是否已經消費了這個事件而不應該再進一步處理它。也就是說,返回true 表示你已經處理了這個事件而且到此為止;返回false 表示你還沒有處理它和/或這個事件應該繼續交給其他on-key偵聽器。
3)() - 返回一個布爾值來指示你的偵聽器是否已經消費了這個事件。重要的是這個事件可以有多個彼此跟隨的動作。因此,如果當接收到向下動作事件時你返回falseandroid 模擬長按事件,那表明你還沒有消費這個事件而且對后續動作也不感興趣。那么,你將不會被該事件中的其他動作調用,比如手勢或最后出現向上動作事件。
記住按鍵事件總是遞交給當前焦點所在的視圖。它們從視圖層次的頂層開始被分發,然后依次向下,直到到達恰當的目標。如果你的視圖(或者一個子視圖)當前擁有焦點,那么你可以看到事件經由()方法分發。除了從你的視圖截獲按鍵事件,還有一個可選方案,你還可以在你的活動中使用() and ()來接收所有的事件。
注意: 將首先調用事件處理器,其次是類定義中合適的缺省處理器。這樣,從這些事情偵聽器中返回true 將停止事件向其它事件偵聽器傳播并且也會阻塞視圖中的缺事件處理器的回調函數。因此當你返回true時確認你希望終止這個事件。
對于這些事件的具體例子,詳見:核心技術與實例詳解—事件處理
4.事件處理器Event
如果你從視圖創建一個自定義組件,那么你將能夠定義一些回調方法被用作缺省的事件處理器。在創建自定義組件 的文檔中,你將學習到一些用作事件處理的通用回調函數,包括:
·(int, ) - 當一個新的按鍵事件發生時被調用。
·(int, ) - 當一個向上鍵事件發生時被調用。
·() - 當一個跟蹤球運動事件發生時被調用。
·() - 當一個觸摸屏移動事件發生時調用。
·(, int, Rect) - 當視圖獲得或者丟失焦點時被調用。
你應該知道還有一些其它方法,并不屬于視圖類的一部分,但可以直接影響你處理事件的方式。所以,當在一個布局里管理更復雜的事件時,考慮一下這些方法:
·.() - 這允許你的活動可以在分發給窗口之前捕獲所有的觸摸事件。
·.t() - 這允許一個視圖組 在分發給子視圖時觀察這些事件。
·.() - 在一個父視圖之上調用這個方法來表示它不應該通過t()來捕獲觸摸事件。
對于這些事件的具體例子,詳見:核心技術與實例詳解—事件處理
5.手勢識別
很多時候,一個好的用戶界面能夠吸引用戶的眼球?,F在我們經常看到一些好的界面都帶有滑動、滾動等效果。但是觸摸屏是不可能產生滾動、滑動的消息的,需要根據其運動的軌跡用算法去判斷實現。在系統中,.view.來實現手勢的識別,我們只需要實現其.接口來偵聽識別后的事件。我們需要在,的方法是進行軌跡識別。
import android.view.GestureDetector;
import android.view.GestureDetector.OnGestureListener;
public class TestEvent extends Activity {
/** Called when the activity is first created. */
TextView m_eventType;
int oldevent = -1;
private GestureDetector gestureDetector= new GestureDetector(new OnGestureListener()
{
// 鼠標按下的時候,會產生onDown。由一個ACTION_DOWN產生。
public boolean onDown(MotionEvent event) {
DisplayEventType("mouse down" + " " + event.getX() + "," + event.getY());
return false;

}
// 用戶按下觸摸屏、快速移動后松開,這個時候,你的手指運動是有加速度的。
// 由1個MotionEvent ACTION_DOWN,
// 多個ACTION_MOVE, 1個ACTION_UP觸發
// e1:第1個ACTION_DOWN MotionEvent
// e2:最后一個ACTION_MOVE MotionEvent
// velocityX:X軸上的移動速度,像素/秒
// velocityY:Y軸上的移動速度,像素/秒
public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX,
float velocityY) {
DisplayEventType("onFling");
return false;
}
// 用戶長按觸摸屏,由多個MotionEvent ACTION_DOWN觸發
public void onLongPress(MotionEvent event) {
DisplayEventType("on long pressed");
}
// 滾動事件,當在觸摸屏上迅速的移動,會產生onScroll。由ACTION_MOVE產生
// e1:第1個ACTION_DOWN MotionEvent
// e2:最后一個ACTION_MOVE MotionEvent
// distanceX:距離上次產生onScroll事件后,X抽移動的距離
// distanceY:距離上次產生onScroll事件后,Y抽移動的距離

public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX,
float distanceY) {
DisplayEventType("onScroll" + " " + distanceX + "," + distanceY);
return false;
}
//點擊了觸摸屏,但是沒有移動和彈起的動作。onShowPress和onDown的區別在于
//onDown是,一旦觸摸屏按下,就馬上產生onDown事件,但是onShowPress是onDown事件產生后,
//一段時間內,如果沒有移動鼠標和彈起事件,就認為是onShowPress事件。
public void onShowPress(MotionEvent event) {
DisplayEventType("pressed");
}
// 輕擊觸摸屏后,彈起。如果這個過程中產生了onLongPress、onScroll和onFling事件,就不會
// 產生onSingleTapUp事件。
public boolean onSingleTapUp(MotionEvent event) {
DisplayEventType("Tap up");
return false;
}
});
@Override

public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
m_eventType = (TextView)this.findViewById(R.id.eventtype);
}
@Override
public boolean onTouchEvent(MotionEvent event)
{
if(gestureDetector.onTouchEvent(event))
return true;
else
return false;
}
}
6、模擬鼠標/按鍵事件
發送鍵盤鼠標事件:提供了豐富的以send開頭的函數接口來實現模擬鍵盤鼠標,如下所述:
(int ) //用于發送指定的按鍵
(int key) //用于發送指定的按鍵
( event) //用于模擬Touch
( text) //用于發送字符串
inst=new ();
inst.(.(.(),.(), ., 10, 10, 0));
inst.(.(.(),.(), ., 10, 10, 0));