Android事件传递和响应:TP和按键

        Android按键事件处理主要在View和Activity两个级别。和Touch事件相比,简单很多。按键事件的处理机制如下:
(1)默认情况下,如果没有View获得焦点,事件将传递给Activity处理。
(2)如果View获得焦点,事件首先传递到View的回调方法中(按键的回调用OnKeyListener,TP的回调用OnTouchListener)。view回调方法不处理的话返回false,事件继续传递到Activity处理。反之,处理了的话返回true,事件不会继续传递。

(3) 一个TP操作的实例

        通过TP操作activity上一个button控件,包括按下、划动、弹起三个操作,来区分出getX()与getRawX()的区别。两者都是获取屏幕坐标,但二者又有区别:getX():是获取相对当前控件(View)的坐标;getRawX():是获取相对显示屏幕左上角的坐标。

        JAVA代码如下,用的仍然是view中的interface:

public class MainActivity extends Activity implements OnTouchListener {
	private Button btn;  
	private int x = 0, y = 0;  
	private int rawX = 0, rawY = 0;
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		
		btn = (Button) findViewById(R.id.btn);  
		btn.setOnTouchListener(this); 
	}

	@Override
	public boolean onTouch(View v, MotionEvent event) {
		// TODO Auto-generated method stub
		int 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
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值