点击事件主要涉及两个对象,即事件源与事件监听器
事件源:事件源指的是事件发生的控件,每个控件在不同情况下触发的事件并不都相同,而且产生的事件对象也可能不同
事件监听器:用于处理事件的对象,实现了特定的接口,根据事件的不同,重写不同的事件处理方法来处理事件
将它们联系在一起,就需要为事件源注册监听,事件发生时相应的监听器则会处理相应的事件
onClickListener 接口
该接口处理的是单击事件,该接口对应的回调方法签名如下
public void onClick(View v)
参数v:是事件源控件。
onLongClickListener 接口
该接口处理的是长按事件,该接口对应的回调方法签名如下
public boolean onLongClick(View v)
参数v:是事件源控件。
返回值:当返回true时表示已经完整的处理了这个事件,并不希望其他回调方法再次处理。返回false时表示并没有完全处理完该事件,更希望其他方法继续对其进行处理。
返回false,允许执行其他事件。
返回true,不允许执行其他事件。
onFocusChangeListener 接口
该接口处理的是控件焦点发生改变的事件,如果注册了该接口,当某个控件失去焦点或者获得焦点时都会出发该接口中的回调方法,该接口对应的回调方法签名如下
public void onFocusChange(View v, Boolean hasFocus)
参数v:是事件源控件。
参数hasFocus:表示v的新状态,即v是否获得焦点。
onKeyListener 接口
该接口是对手机键盘进行监听的接口,通过对某个View注册监听,在该View获得焦点并有键盘事件时,便会触发该接口中的回调方法,该接口对应的回调方法签名如下
public boolean onKey(View v, int keyCode, KeyEvent event)
参数v:是事件源控件。
参数keyCode:为手机键盘的键盘码。
参数event:为键盘事件的封装类对象,其中包含了事件的详细信息,例如发生的事件、时间的类型等。
返回值:当返回true时表示已经完整的处理了这个事件,并不希望其他回调方法再次处理。返回false时表示并没有完全处理完该事件,更希望其他方法继续对其进行处理。
返回false,允许执行其他事件。
返回true,不允许执行其他事件。
onTouchListener 接口
该接口是用来处理手机屏幕事件的监听接口,View范围内的触摸安歇、抬起或滑动等动作都会除法该事件,该接口对应的回调方法签名如下
public boolean onTouch(View v, MotionEvent event)
参数v:是事件源控件。
参数event:为键盘事件的封装类对象,其中包含了事件的详细信息,同样包括发生的事件、时间的类型等。
返回值:当返回true时表示已经完整的处理了这个事件,并不希望其他回调方法再次处理。返回false时表示并没有完全处理完该事件,更希望其他方法继续对其进行处理。
返回false,允许执行其他事件。
返回true,不允许执行其他事件。
对于boolean返回值值得注意的是,如果没有其他事件继续进行建议返回true
这是我刚刚遇到的问题
ImageView view = (ImageView)findViewById(id);
view.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View view, MotionEvent motionEvent) {
switch (motionEvent.getAction()) {
case MotionEvent.ACTION_DOWN:
view.setBackgroundColor(Color.parseColor("#66EEEEEE"));
break;
case MotionEvent.ACTION_UP:
view.setBackgroundColor(Color.parseColor("#00000000"));
break;
}
return false;//这里返回了false
}
});
想做touch时背景变暗松开后恢复的效果,发现仅执行了
case MotionEvent.ACTION_DOWN: view.setBackgroundColor(Color.parseColor("#66EEEEEE"));
break;
而没有执行
case MotionEvent.ACTION_UP: view.setBackgroundColor(Color.parseColor("#00000000"));
break;
解决方法是增加onClick方法或者返回true,具体原因还不知道。。。
参考《Android 编程兵书》及网络资料