Android事件傳遞和響應:按鍵和TP

來源:互聯網
上載者:User

        Android按鍵事件處理主要在View和Activity兩個層級。和Touch事件相比,簡單很多。按鍵事件的處理機制如下:
(1)預設情況下,如果沒有View獲得焦點,事件將傳遞給Activity處理。
(2)如果View獲得焦點,事件首先傳遞到View的回調方法中。view回調方法不處理的話返回false,事件繼續傳遞到Activity處理。反之,事件不會繼續傳遞。PS:使用View.SetFocusable(true)設定可以獲得焦點。

(3)需要注意的是:
A,按鍵的onKeyDown和onKeyUp是相互獨立的,不會相互影響。
B,無論是View還是Activity中,建議重寫事件回調方法時,只對處理過的按鍵返回true,沒有處理的事件應該調用其父類方法。否則,其他未處理事件不會被傳遞到合適的目標組件中。

(4) 一個TP操作的執行個體

        通過TP操作activity上一個button控制項,包括按下、划動、彈起三個操作,來區分出getX()與getRawX()的區別。兩者都是擷取螢幕座標,但二者又有區別:getX():是擷取相對當前控制項(View)的座標;getRawX():是擷取相對顯示螢幕左上方的座標。

        JAVA代碼如下:

public class MainActivity extends Activity implements OnTouchListener {private Button btn;  private int x = 0, y = 0;  private int rawX = 0, rawY = 0;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);btn = (Button) findViewById(R.id.btn);  btn.setOnTouchListener(this); }@Overridepublic boolean onTouch(View v, MotionEvent event) {// TODO Auto-generated method stubint eventaction = event.getAction();  switch (eventaction) { case MotionEvent.ACTION_DOWN:  x = (int) event.getX();  y = (int) event.getY();  rawX = (int) event.getRawX();  rawY = (int) event.getRawY();          Log.e("homer", "ACTION_DOWN x = " + x + "; y = " + y + "; rawX = " + rawX + "; rawY = " + rawY);  break;case MotionEvent.ACTION_MOVE:  x = (int) event.getX();  y = (int) event.getY();  rawX = (int) event.getRawX();  rawY = (int) event.getRawY();          Log.e("homer", "ACTION_MOVE x = " + x + "; y = " + y + "; rawX = " + rawX + "; rawY = " + rawY);  break;  case MotionEvent.ACTION_UP:  x = (int) event.getX();  y = (int) event.getY();  rawX = (int) event.getRawX();  rawY = (int) event.getRawY();          Log.e("homer", "ACTION_UP x = " + x + "; y = " + y + "; rawX = " + rawX + "; rawY = " + rawY);break; }return false;}}

操作TP的結果,就是如下LOG TRACE:

04-11 02:41:00.479: E/homer(589): ACTION_DOWN x = 15; y = 12; rawX = 107; rawY = 101
04-11 02:41:00.611: E/homer(589): ACTION_UP x = 15; y = 12; rawX = 107; rawY = 101
04-11 02:41:03.749: E/homer(589): ACTION_DOWN x = 13; y = 29; rawX = 105; rawY = 118
04-11 02:41:03.819: E/homer(589): ACTION_UP x = 13; y = 29; rawX = 105; rawY = 118
04-11 02:41:11.410: E/homer(589): ACTION_DOWN x = 44; y = 47; rawX = 136; rawY = 136
04-11 02:41:11.480: E/homer(589): ACTION_MOVE x = 51; y = 55; rawX = 143; rawY = 144
04-11 02:41:11.519: E/homer(589): ACTION_MOVE x = 72; y = 68; rawX = 164; rawY = 157
04-11 02:41:11.549: E/homer(589): ACTION_MOVE x = 112; y = 89; rawX = 204; rawY = 178
       總結:getX() 是表示Widget相對於自身左上方的x座標,而getRawX()是表示相對於螢幕左上方的x座標值(注意:這個螢幕左上方是手機螢幕左上方,不管activity是否有titleBar或是否全螢幕); getY(),getRawY()一樣的道理。

 

參考原文:http://orgcent.com/android-key-event-mechanism/

參考原文:http://blog.csdn.net/sunboy_2050/article/details/8757240

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.