官术网_书友最值得收藏!

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是縮小聲音鍵鍵編碼。

主站蜘蛛池模板: 雷山县| 明溪县| 哈尔滨市| 阳高县| 长沙市| 彰武县| 江城| 深州市| 桐乡市| 稻城县| 会宁县| 英超| 晋宁县| 克拉玛依市| 许昌市| 郯城县| 辽中县| 泊头市| 元朗区| 阳江市| 柳江县| 天柱县| 海阳市| 若尔盖县| 新平| 宁南县| 新干县| 时尚| 喀喇沁旗| 石阡县| 北票市| 安国市| 增城市| 阳原县| 吉安县| 沙雅县| 郑州市| 镇沅| 虎林市| 贵州省| 增城市|