Android触摸屏开发
进行Android触摸屏的程序设计与开发已有三个月的时间了,在这期间,通过无数次的尝试和手势设计,学到了很多知识,下面将我总结的分享给大家。
多点触控
getX是获取以widget左上角为坐标原点计算的X轴坐标直。
getRawX 获取的是以屏幕左上角为坐标原点计算的X轴坐标直。
event.getAction() //获取触控动作比如ACTION_DOWN
event.getPointerCount(); //获取触控点的数量,比如2则可能是两个手指同时按压屏幕
event.getPointerId(nID); //对于每个触控的点的细节,我们可以通过一个循环执行getPointerId方法获取索引
event.getX(nID); //获取第nID个触控点的x位置
event.getY(nID); //获取第nID个点触控的y位置
event.getPressure(nID); //LCD可以感应出用户的手指压力,当然具体的级别由驱动和物理硬件决定的
event.getDownTime() //按下开始时间
event.getEventTime() // 事件结束时间
event.getEventTime()-event.getDownTime()); //总共按下时花费时间
事件侦听器
事件侦听器是视图View类的接口,包含一个单独的回调方法。这些方法将在视图中注册的侦听器被用户界面操作触发时由Android框架调用。下面这些回调方法被包含在事件侦听器接口中:
onClick()
包含于View.OnClickListener。当用户触摸这个item(在触摸模式下),或者通过浏览键或跟踪球聚焦在这个item上,然后按下“确认”键或者按下跟踪球时被调用。
onLongClick()
包含于View.OnLongClickListener。当用户触摸并控制住这个item(在触摸模式下),或者通过浏览键或跟踪球聚焦在这个item上,然后保持按下“确认”键或者按下跟踪球(一秒钟)时被调用。
onFocusChange()
包含于View.OnFocusChangeListener。当用户使用浏览键或跟踪球浏览进入或离开这个item时被调用。
onKey()
包含于View.OnKeyListener。当用户聚焦在这个item上并按下或释放设备上的一个按键时被调用。
onTouch()
包含于View.OnTouchListener。当用户执行的动作被当做一个触摸事件时被调用,包括按下,释放,或者屏幕上任何的移动手势(在这个item的边界内)。
onCreateContextMenu()
包含于View.OnCreateContextMenuListener。当正在创建一个上下文菜单的时候被调用(作为持续的“长点击”动作的结果)。
事件处理器Event Handlers
如果你从视图创建一个自定义组件,那么你将能够定义一些回调方法被用作缺省的事件处理器。在创建自定义组件Building Custom Components的文档中,你将学习到一些用作事件处理的通用回调函数,包括:
onKeyDown(int, KeyEvent) – 当一个新的按键事件发生时被调用。
onKeyUp(int, KeyEvent) – 当一个向上键事件发生时被调用。
onTrackballEvent(MotionEvent) – 当一个跟踪球运动事件发生时被调用。
onTouchEvent(MotionEvent) – 当一个触摸屏移动事件发生时调用。
onFocusChanged(boolean, int, Rect) – 当视图获得或者丢失焦点时被调用。
你应该知道还有一些其它方法,并不属于视图类的一部分,但可以直接影响你处理事件的方式。所以,当在一个布局里管理更复杂的事件时,考虑一下这些方法:
Activity.dispatchTouchEvent(MotionEvent) – 这允许你的活动可以在分发给窗口之前捕获所有的触摸事件。
ViewGroup.onInterceptTouchEvent(MotionEvent) – 这允许一个视图组ViewGroup 在分发给子视图时观察这些事件。ViewParent.requestDisallowInterceptTouchEvent(boolean) – 在一个父视图之上调用这个方法来表示它不应该通过onInterceptTouchEvent(MotionEvent)来捕获触摸事件。
viewGroup的dispatchTouchEvent方法会在其onInterceptTouchEvent方法之前被触发。
首先触发ACTIVITY的dispatchTouchEvent
然后触发ACTIVITY的onUserInteraction
然后触发LAYOUT的dispatchTouchEvent
然后触发LAYOUT的onInterceptTouchEvent
总结:
1. 点击屏幕上的某项的执行流程 有两种情况,一种是时间很短,一种时间稍长
时间很短:onDown——–》onSingleTapUp——–》onSingleTapConfirmed
时间稍长:onDown——–》onShowPress——》onSingleTapUp——–》onSingleTapConfirmed
2. 长按事件
onDown——–》onShowPress——》onLongPress
3.抛:手指触动屏幕后,稍微滑动后立即松开
onDown—–》onscroll—-》onscroll—-》onscroll—-》………—–>onFling
4.拖动
onDown——》onscroll—-》onscroll——》onFiling
注意:有的时候会触发onFiling,但是有的时候不会触发有可能是人的动作不标准所致。
boolean onDoubleTap(MotionEvent e)
//双击的第二下Touch down时触发
boolean onDoubleTapEvent(MotionEvent e)
//双击的第二下Touch down和up都会触发,可用e.getAction()区分。
boolean onDown(MotionEvent e)
//Touch down时触发
boolean onFling(MotionEvent e1 MotionEvent e2 float velocityX float velocityY)
//Touch了滑动一点距离后,up时触发。
void onLongPress(MotionEvent e)
//Touch了不移动一直Touch down时触发
boolean onscroll(MotionEvent e1 MotionEvent e2 float distanceX float distanceY)
//Touch了滑动时触发。
void onShowPress(MotionEvent e)
//Touch了还没有滑动时触发
(与onDown,onLongPress比较onDown只要Touch down一定立刻触发。而Touchdown后过一会没有滑动先触发onShowPress再是onLongPress。所以Touchdown后一直不滑动,onDown->onShowPress->onLongPress这个顺序触发。)
boolean onSingleTapConfirmed(MotionEvent e)
boolean onSingleTapUp(MotionEvent e)
//上面这两个函数都是在touch down后又没有滑动(onscroll),又没有长按(onLongPress),然后Touchup时触发。
//点击一下非常快的(不滑动)Touchup:
onDown->onSingleTapUp->onSingleTapConfirmed
//点击一下稍微慢点的(不滑动)Touchup:
onDown->onShowPress->onSingleTapUp->onSingleTapConfirmed