7.1.3 onTouchEvent方法簡介java
前面已經介紹了手機鍵盤事件的處理方法,接下來將介紹手機屏幕事件的處理方法onTouchEvent。該方法在View類中的定義,而且全部的View子類所有重寫了該方法,應用程序能夠經過該方法處理手機屏幕的觸摸事件。該方法的簽名以下所示。android
- public boolean onTouchEvent (MotionEvent event)
參數event:參數event爲手機屏幕觸摸事件封裝類的對象,其中封裝了該事件的全部信息,例如觸摸的位置、觸摸的類型以及觸摸的時間等。該對象會在用戶觸摸手機屏幕時被建立。canvas
返回值:該方法的返回值機理與鍵盤響應事件的相同,一樣是當已經完整地處理了該事件且不但願其餘回調方法再次處理時返回true,不然返回false。app
該方法並不像以前介紹過的方法只處理一種事件,通常狀況下如下三種狀況的事件所有由onTouchEvent方法處理,只是三種狀況中的動做值不一樣。ide
屏幕被按下:當屏幕被按下時,會自動調用該方法來處理事件,此時MotionEvent.getAction()的值爲MotionEvent.ACTION_DOWN,若是在應用程序中須要處理屏幕被按下的事件,只需從新該回調方法,而後在方法中進行動做的判斷便可。post
屏幕被擡起:當觸控筆離開屏幕時觸發的事件,該事件一樣須要onTouchEvent方法來捕捉,而後在方法中進行動做判斷。當MotionEvent.getAction()的值爲MotionEvent.ACTION_UP時,表示是屏幕被擡起的事件。this
在屏幕中拖動:該方法還負責處理觸控筆在屏幕上滑動的事件,一樣是調用MotionEvent.getAction()方法來判斷動做值是否爲MotionEvent.ACTION_MOVE再進行處理。spa
接下來經過一個簡單的案例介紹該方法的使用方法。在該案例中,會在用戶點擊的位置繪製一個矩形,而後監測用戶觸控筆的狀態,當用戶在屏幕上移動觸控筆時,使矩形隨之移動,而當用戶觸控筆離開手機屏幕時,中止繪製矩形。該案例的開發步驟以下。code
建立一個名爲Sample_7_2的Android項目。對象
打開Sample_7_2.java文件,輸入以下所示的代碼。
- 1 package wyf.ytl; //聲明所在包
- 2 import android.app.Activity; //引入Activity類
- 3 import android.content.Context; //引入Context類
- 4 import android.graphics.Canvas; //引入Canvas類
- 5 import android.graphics.Color; //引入Color類
- 6 import android.graphics.Paint; //引入Paint類
- 7 import android.os.Bundle; //引入Bundle類
- 8 import android.view.MotionEvent; //引入MotionEvent類
- 9 import android.view.View; //引入View類
- 10 public class Sample_7_2 extends Activity {
- 11 MyView myView; //自定義View的引用
- 12 public void onCreate(Bundle savedInstanceState) { //重寫的onCreate方法
- 13 super.onCreate(savedInstanceState);
- 14 myView = new MyView(this); //初始化自定義的View
- 15 setContentView(myView); //設置當前顯示的用戶界面
- 16 }
- 17 @Override
- 18 public boolean onTouchEvent(MotionEvent event) { //重寫的onTouchEvent回調方法
- 19 switch(event.getAction()){
- 20 case MotionEvent.ACTION_DOWN: //按下
- 21 myView.x = (int) event.getX(); //改變x座標
- 22 myView.y = (int) event.getY()-52; //改變y座標
- 23 myView.postInvalidate(); //重繪
- 24 break;
- 25 case MotionEvent.ACTION_MOVE: //移動
- 26 myView.x = (int) event.getX(); //改變x座標
- 27 myView.y = (int) event.getY()-52; //改變y座標
- 28 myView.postInvalidate(); //重繪
- 29 break;
- 30 case MotionEvent.ACTION_UP: //擡起
- 31 myView.x = -100; //改變x座標
- 32 myView.y = -100; //改變y座標
- 33 myView.postInvalidate(); //重繪
- 34 break;
- 35 }
- 36 return super.onTouchEvent(event);
- 37 }
- 38 class MyView extends View{ //自定義的View
- 39 Paint paint; //畫筆
- 40 int x = 50; //x座標
- 41 int y = 50; //y座標
- 42 int w = 50; //矩形的寬度
- 43 public MyView(Context context) { //構造器
- 44 super(context);
- 45 paint = new Paint(); //初始化畫筆
- 46 }
- 47 @Override
- 48 protected void onDraw(Canvas canvas) { //繪製方法
- 49 canvas.drawColor(Color.GRAY); //繪製背景色
- 50 canvas.drawRect(x, y, x+w, y+w, paint); //繪製矩形
- 51 super.onDraw(canvas);
- 52 }
- 53 }
- 54 }
代碼位置:見隨書光盤中源代碼/第7章/ Sample_7_2/src/wyf/ytl目錄下的Sample_7_2.java。
第11行聲明自定義View的引用,第12~16行重寫Activity的onCreate方法,該方法會在此Activity建立時被系統調用,在方法中先初始化自定義的View,而後將當前的用戶界面設置成該View。
第18~37行爲重寫的屏幕監聽方法,在該方法中,根據事件動做的不一樣執行不一樣的操做。
第20~24行表示當前事件爲屏幕被按下的事件,經過調用MotionEvent的getX()和getY()方法獲得事件發生的座標,而後設置給自定義View的x與y成員變量。
第25~29行表示在屏幕上滑動時的事件,一樣是獲得事件發生的位置並設置給View的x、y。須要注意的是,由於此時手機屏幕並非全屏模式,因此須要對座標進行調整。
第30~34行處理的是屏幕被擡起的事件,此時將View的x、y成員變量設成-100。表示並不須要在屏幕中繪製矩形。
第38~53行爲自定義的View類,並重寫了繪製方法onDraw。在第43~45行的構造器中初始化繪製時須要的畫筆,而後在第48~52行的方法中根據成員變量x、y的值繪製繪製矩形。
提示:自定義的View並不會自動刷新,因此每次改變數據模型時都須要調用postInvalidate方法進行屏幕的刷新操做。關於自定義View的使用方法,將會在後面的章節中進行詳細介紹,此處只是簡單地使用。
運行該案例,將看到如圖7-3所示的效果。
點擊屏幕時,會在點擊的位置繪製一個矩形,當觸控筆在屏幕中滑動時,該矩形會隨之移動,而當觸控筆離開屏幕時,便會取消繪製矩形。