Android手势学习之单点手势
说在前面,很早时,android就开始有支持单点手势(单点触控),到android2.2开始支持多点触控.
不同的动作序列合起来表示不同的手势。比如Fling手势包括三个过程:将手指按触在屏幕上,然后快速扫过,最后
抬起手指,并且在抬起手指仍然在运动(也就是说抬起手指前,运动的速度并不会减少).每一个步操作都会触发相应的事件。
在View控件内,开发人员可以像处理普通的单击事件时使用setOnClickListener()和setOnLongClickListener()
方法一样处理手势。onTouchEvent()回调方法用于探测View区域内的用户动作。
onTouchEvent()回调方法只接收一个参数。MotionEvent对象。MotionEvent对象包含在View内触发的所有类型动作
的细节,通过收集和分析连续的MotionEvent对象,开发人员可以确定产生了何种手势。你可以使用MotionEvent数据
来识别的探测任何你能想像的手势。不过你也可以使用Android SDK 内置的手势探测器来探测普通的用户动作。
android目前拥有两个不同的类用于手势探测。
(1) GestureDetector类可以用于探测一般的单点触控手势。
(2) ScaleGestureDetector可以用来探测多点缩放操作手势。
除了普通的方向性手势,你还可以使用API level 4中引入的android.gesture包中的GestureOverlayView来识别命令手势。
下面主要是处理普通单点触控手势
API level 1中引入的GestureDetector类可以用来探测单个手势。GestureDetector类所支持的单指手势包括以下几种。
onDown:当用户第一次按触屏幕时触发。
onShowPress:当用户按触屏幕,并且在抬起或移动手指之前触发:用于显示显示地指示按触事件确已探测到。
onSingleTapUp:作为单击(sinlge-tap)事件的一部分,在用户从触屏上抬起手指(使用抬起MotionEvent)时触发。
onSingleTabConfirmed:单击事件发生时调用。
onDoubleTab:双击(double-tap)事件发生时调用。
onDoubleTabEvent:在任何双击手势发生时调用,包括按下(down),移动,或抬起(up)MotionEvent.
onLongPress:与onSingleTapUp类似,但只在用户保持按触状态且不移动一定时间,并且不是标准的单击操作时调用。
onScroll:用户按下手指并且匀速移动手指后,在抬起手指前调用。通常也称为“拖曳”(dragging).
onFling:在用户按下并且加速移动手指后,在抬起手指前调用,通常也称为拂动(flick)手势。
提示:你可以使用GestureDetector.SimpleOnGestureListener类来监听由GestureDetector识别的任何手势。
实例:在Android中实现图片左右滑动效果。
参考来自:
http://www.cnblogs.com/hanyonglu/archive/2012/02/13/2349827.html
原文比较详细,在此不转。注意的一点就是,为了不带那些不用的方法,可以继承SimpleOnGestureListener类。
说一下,我个人的感受。
1.受到一些网上不正确的文章,实习OnTouchListener了。
结果,本来应该重写GestureDetector.OnGestureListener接口的
onTouchEvent方法时,实现了onTouch()方法,害我老是看不到效果,这里弄,那里查,结果,找了开始那本书学习。
系统学习之后,然后我看源代码。发现了GestureDetector类这样的javadoc:
1/**
2* To use this class:
3 *
- Create an instance of the {@code GestureDetector} for your {@link View}
5 *
- In the {@link View#onTouchEvent(MotionEvent)} method ensure you call
6 * {@link #onTouchEvent(MotionEvent)}. The methods defined in your callback
7 * will be executed when the events occur.
8 *
4 *
9**/
上面那个ensure让我觉得应该检查下是不是实现了。然后,结果就出来了。哈哈。太不小心了。
关于判断手势效果的代码:
1Toast.makeText(getApplicationContext(), msg, Toast.LENGTH_SHORT);
2 if (e1.getX() - e2.getX() > 120) {
3 this.mFlipper.setInAnimation(AnimationUtils.loadAnimation(this, R.anim.push_left_in));
4 this.mFlipper.setOutAnimation(AnimationUtils.loadAnimation(this, R.anim.push_left_out));
5this.mFlipper.showNext();
6 return true;
7 }
1.上面触发事件时,我写有Toast提醒代码,但是实际上,用户看不到。
2.第二 上面判断手势距离要求120px有点大长了。
下面学习下其中起到关键作用的另外一个类。ViewFlipper.
ViewFlipper的类继承关系如下:
ViewFlipper->ViewAnimator->FrameLayout->ViewGroup->View->Object
看一下类描述:(中文翻译来自Android中文翻译组)
1/**
2 * Simple {@link ViewAnimator} that will animate between two or more views
3 * that
- Windows CE 进程、线程和内存管理(11-09)
- RedHatLinux新手入门教程(5)(11-12)
- uClinux介绍(11-09)
- openwebmailV1.60安装教学(11-12)
- Linux嵌入式系统开发平台选型探讨(11-09)
- Windows CE 进程、线程和内存管理(二)(11-09)