简单收录自己的理解,作为技术博客生涯的开头.
1.onTouch()方法
在view的onTouchListener()接口中定义,在一个view绑定了一个onTouchListener()后,有touch事件触发的时候,就会调用onTouch()方法(手指放在view上,会一遍一遍的调用)
2.onTouchEvent()方法
是Activity的方法,如果重写了onTouchEvent()方法后,当屏幕有touch事件时就会触发,此方法就会被调用.(手指放在Activity上,就会被不停的调用)
3.touch事件传递
在一个Activity中如果放置了一个TextView,并且设置为fill_parent,这时候手指放上,就会执行onTouch()方法.
如果onTouch()返回true,表示处理完毕,touch事件就不会传递给Activity,也就是说onTouchEvent()方法不会被调用.
如果onTouch()返回false,表示事件没有处理完成,这时候touch事件就会传递给Activity,就是onTouchEvent()方法回被调用.
好像说到这里,就需要在更新一下细节的知识点
ViewGroup和View
ViewGroup顾名思义,为View的集合,它包含很多的View和ViewGroup.也是Android中所有布局的父类或者间接的父类.而ViewGroup比起View,它可以包含子View和定义布局参数的功能.
事件传递顺序
Android中的事件传递,绝对是先传递到ViewGroup,在传递到View.只要触摸了任何控件,就一定会调用该控件的dispatchTouchEvent()方法.这里说的在完整些就是:当点击了某个控件,首先会去调用该控件所在布局的dispatchTouchEvent()方法,然后在布局的dispatchTouchEvent()方法中找到被点击的相应控件,再去调用该控件的dispatchTouchEvent()方法.
针对屏幕上的一个事件,Android如何区分触发的是onTouchEvent(),onClick(),onLongClick().
1.onTouchEvent()
最常用的三个事件为:ACTION_DOWN,ACTION_UP,ACTION_MOVE.
ACTION_DOWN作为起始事件,它的重要性超过其他两个,如果发生了其他的两个事件,那么一定曾经发生过ACTION_DOWN.
2.onClick(),onLongClick(),onTouchEvent()
在Android中,如果在一个View中同时复写了三个方法后,onTouchEvent()是最先捕捉到ACTION_DOWN和ACTION_UP方法的.其次才可能触发onClick()和onLongClick()方法的.
case MotionEvent.ACTION_DOWN:
mPrivateFlags |= PRESSED;
refreshDrawableState();
if ((mViewFlags & LONG_CLICKABLE) == LONG_CLICKABLE) {
postCheckForLongClick();
}
break;
case MotionEvent.ACTION_UP:
if ((mPrivateFlags & PRESSED) != 0) {
boolean focusTaken = false;
if (isFocusable() && isFocusableInTouchMode() && !isFocused()) {
focusTaken = requestFocus();
}
if (!mHasPerformedLongPress) {
if (mPendingCheckForLongPress != null) {
removeCallbacks(mPendingCheckForLongPress);
}
if (!focusTaken) {
performClick();
}
}
…
break;
这里可以看到,Click的触发是在系统捕捉到ACTION_UP后并由 performClick()执行的,而这个方法里会先调用之前注册的OnClick()方法.
而LongClick()的触发则是从ACTION_DOWN开始,由postCheckLongClick()方法完成.这个方法里,当事件被捕捉后,系统会触发一个postDelay()的方法,这里设定的时间为500ms,当500ms以上为触发long操作.