- Android開發:從0到1 (清華開發者書庫)
- 趙志榮
- 1582字
- 2020-11-28 16:13:37
5.4 屏幕上的事件處理
在Android系統中,屏幕是通過活動(Activity)管理的,一個活動相當于一個屏幕,那么屏幕上的事件處理就是活動的事件處理,活動是事件源,活動有觸摸事件和鍵盤事件等。
屏幕事件是在Android應用中常用的事件,本節介紹屏幕中的觸摸事件和鍵盤事件。
5.4.1 觸摸事件
現在,智能手機設計的一個理念是:可觸摸與大屏幕。Android系統支持觸摸屏開發,觸摸屏事件要通過運動事件(MotionEvent)接收信息,如果屏幕中觸摸事件的事件源是活動,開發人員需要重寫活動方法:
public boolean onTouchEvent(MotionEvent event)
onTouchEvent方法返回值是布爾類型,返回true表示已經處理了該事件,false表示還沒有處理該事件。參數event是MotionEvent類型,MotionEvent是運動事件,通過MotionEvent的int getAction()方法可以獲得觸摸動作,觸摸動作有三種,通過MotionEvent三個常量表示:
? MotionEvent.ACTION_UP。在屏幕上手指抬起。
? MotionEvent.ACTION_DOWN。在屏幕上手指按下。
? MotionEvent.ACTION_MOVE。在屏幕上手指移動。
另外,觸摸點的坐標可以通過MotionEvent的getX()和getY()方法獲得。
5.4.2 實例:屏幕觸摸事件
圖5-8是屏幕觸摸事件實例,當手指在屏幕上按下、抬起和移動時候,手指的動作會顯示在屏幕的標簽(TextView)上,觸摸點的坐標也會顯示在屏幕的標簽(TextView)。

圖5-8 觸摸事件實例
布局文件activity_main.xml代碼如下:
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/ apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical"> <TextView ① android:id="@+id/action" android:layout_width="wrap_content" android:layout_height="wrap_content" android:textSize="20sp"/> <TextView ② android:id="@+id/postion" android:layout_width="wrap_content" android:layout_height="wrap_content" android:textSize="20sp"/> </LinearLayout>
在布局文件中聲明了兩個標簽(TextView),代碼第①行的標簽用來顯示手指的動作,代碼第②行的標簽用來顯示觸摸點的位置坐標。
MainActivity.java代碼如下:
public class MainActivity extends AppCompatActivity{ private TextView mAction; private TextView mPostion; @Override public void onCreate(Bundle savedInstanceState){ super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); mAction=(TextView) findViewById(R.id.action); mPostion=(TextView) findViewById(R.id.postion); } @Override public boolean onTouchEvent(MotionEvent event){ ① int action= event.getAction(); ② switch(action){ caseMotionEvent.ACTION_UP: ③ mAction.setText("手指抬起"); break; caseMotionEvent.ACTION_DOWN: ④ mAction.setText("手指按下"); break; caseMotionEvent.ACTION_MOVE: ⑤ mAction.setText("手指移動"); } float X = event.getX(); ⑥ float Y = event.getY(); ⑦ mPostion.setText("位置 =("+ X +", "+ Y +")"); return true; }
上述代碼第①行是在活動中重寫onTouchEvent方法,代碼第②行是獲得觸摸動作。代碼第③行是判斷手指在屏幕上抬起,代碼第④行是判斷手指在屏幕上按下,代碼第④行是判斷手指在屏幕上移動。
代碼⑥行是獲得觸摸點的X軸坐標,代碼⑦行是獲得觸摸點的Y軸坐標。
5.4.3 鍵盤事件
能夠響應鍵盤事件的事件源可以是視圖(View及其子類),也可以是活動(即屏幕),無論是視圖還是活動鍵盤響應事件的處理模式都是類似的。本節介紹鍵盤事件的響應。
響應鍵盤事件就是通過使用KeyEvent接收信息,如果事件源是活動的,需要重寫下面的方法:
? boolean onKeyUp(int keyCode, KeyEvent event);
? boolean onKeyDown(int keyCode, KeyEvent event);
? boolean onKeyLongPress(int keyCode, KeyEvent event)。
這個幾個方法返回值true表示已經處理了該事件,返回false表示還沒有處理該事件。方法參數keyCode鍵的編碼,event參數是KeyEvent類型,KeyEvent是鍵盤事件。KeyEven中定義了很多鍵編碼常量,如KeyEvent.KEYCODE_A常量編碼表示A鍵。
另外,通過KeyEven的int getAction()方法可以獲得鍵盤動作,鍵盤動作有三種,通過KeyEven三個常量表示如下:
? KeyEven.ACTION_UP。鍵抬起。
? KeyEven.ACTION_DOWN。鍵按下。
? KeyEven.ACTION_MULTIPLE。多次重復鍵按下。
5.4.4 實例:改變圖片的透明度
本例實現如圖5-9所示的內容,通過鍵盤來控制屏幕上的一個圖片的透明度,圖片的透明度是通過圖片的Alpha值描述的,Android中的Alpha值在0~255之間,0表示完全透明,255表示完全不透明。

圖5-9 鍵盤事件實例
提示 用什么鍵來控制聲音的大和小呢?目前新款的Android手機多采用“軟鍵盤”設計,手機上的硬件鍵很少,但至少都有聲音控制鍵(包括放大聲音鍵和縮小聲音鍵兩個)和關機鍵,如圖5-10(a)所示是在模擬器上的聲音控制鍵,圖5-10(b)是在nexus設備上的聲音控制鍵。本例可以利用這兩個聲音控制鍵控制圖片透明度。

圖5-10 聲音控制鍵
布局文件activity_main.xml代碼如下:
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical"> <TextView ① android:id="@+id/alphavalue" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center"/> <ImageView ② android:id="@+id/image" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center" android:src="@mipmap/image"/> </LinearLayout>
在布局文件中,代碼第①行聲明了一個標簽(TextView)控件,代碼第②行聲明了一個(ImageView),用來顯示圖片。
public class MainActivity extends AppCompatActivity{ ... @Override public void onCreate(Bundle savedInstanceState){ super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); mImage =(ImageView) findViewById(R.id.image); mAlphavalueText =(TextView) findViewById(R.id.alphavalue); mAlphavalue = 100; //透明度初始值100 mImage.setImageAlpha(mAlphavalue); //設置圖片初始透明度 mAlphavalueText.setText("Alpha="+ mAlphavalue * 100/255 +"%"); ① } @Override public boolean onKeyDown(int keyCode, KeyEvent event){ ② switch(keyCode){ case KeyEvent.KEYCODE_VOLUME_UP: //放大聲音鍵 ③ mAlphavalue += 20; break; case KeyEvent.KEYCODE_VOLUME_DOWN: //縮小聲音鍵 ④ mAlphavalue -= 20; break; } if(mAlphavalue = 255){ mAlphavalue = 255; //透明度最大值255 } if(mAlphavalue = 0){ mAlphavalue = 0; //透明度最小值0 } mImage.setImageAlpha(mAlphavalue); mAlphavalueText.setText("Alpha="+ mAlphavalue * 100/255 +"%"); return super.onKeyDown(keyCode, event); } }
上述代碼第①行是設置mAlphavalueText標簽控件的內容,mAlphavalue* 100/255表達式可以計算出透明度的百分比。
代碼第②行重寫活動的onKeyDown(int keyCode, KeyEvent event)方法,同類方法還有很多,本例只關心鍵盤按下事件。代碼第③行是判斷是否放大聲音鍵按下,KeyEvent. KEYCODE_VOLUME_UP是放大聲音鍵鍵編碼。代碼第④行是判斷是否縮小聲音鍵按下,KeyEvent.KEYCODE_VOLUME_DOWN是縮小聲音鍵鍵編碼。
- Learning Cython Programming
- Spring Cloud Alibaba微服務架構設計與開發實戰
- Reactive Programming with Swift
- AngularJS Web Application Development Blueprints
- Unity 5.x By Example
- Python忍者秘籍
- HTML5+CSS3 Web前端開發技術(第2版)
- C++從入門到精通(第5版)
- Android驅動開發權威指南
- 持續集成與持續交付實戰:用Jenkins、Travis CI和CircleCI構建和發布大規模高質量軟件
- Arduino計算機視覺編程
- 計算機應用基礎項目化教程
- 動手打造深度學習框架
- Python網絡爬蟲實例教程(視頻講解版)
- Get Your Hands Dirty on Clean Architecture