在手势识别-GestureDetector中我们介绍了如何使用GestureDetector来识别用户的单击,双击,滑动等手势,然而在开发的过程中,我们有时需要识别用户缩放的手势,比如用户使用手指来缩放查看图片等,下面我来介绍一下如何使用ScaleGestureDetector来识别缩放手势。
ScaleGestureDetector的使用流程
ScaleGestureDetector的使用类似于GestureDetector。大致分为以下几步
- 实例化ScaleGestureDetector并为其注册监听器。
- 对需要进行手势识别的控件使用setOnTouchListener()或者覆写onTouchEvent()捕获Touch消息。
- 将Touch事件中获得的MotionEvent对象传递给ScaleGestureDetector,由ScaleGestureDetector处理Touch事件。
- ScaleGestureDetector处理后的消息通过监听器返回给用户。用户根据需要进行处理。
ScaleGestureDetector的监听器
ScaleGestureDetector提供的事件监听器为:OnScaleGestureListener,对应如下几个方法。
//缩放事件执行
public boolean onScale(ScaleGestureDetector detector)
//缩放事件执行开始
//返回true表示继续接受缩放消息,调用onScale
//返回false表示不继续处理缩放消息,不会继续调用下面的回调函数。
public boolean onScaleBegin(ScaleGestureDetector detector)
//缩放事件执行结束
public void onScaleEnd(ScaleGestureDetector detector)
同样类似于GestureDetector,ScaleGestureDetector还提供了一个实现了OnScaleGestureListener接口的类SimpleOnScaleGestureListener,此类覆写了上面三个回调函数(空实现),我们可以继承SimpleOnScaleGestureListener,按照需求覆写响应的函数。
ScaleGestureDetector的常用方法
- public float getCurrentSpan ()
返回手势过程中,组成该手势的两个触点的当前距离。
返回值:以像素为单位的触点距离。
- public long getEventTime ()
返回事件被捕捉时的时间。
返回值:以毫秒为单位的事件时间。
- public float getFocusX ()
返回当前手势焦点的 X 坐标。 如果手势正在进行中,焦点位于组成手势的两个触点之间。 如果手势正在结束,焦点为仍留在屏幕上的触点的位置。若 isInProgress()返回 false,该方法的返回值未定义。
返回值:返回焦点的 X 坐标值,以像素为单位。
- public float getFocusY ()
返回当前手势焦点的 Y 坐标。 如果手势正在进行中,焦点位于组成手势的两个触点之间。 如果手势正在结束,焦点为仍留在屏幕上的触点的位置。若 isInProgress()返回 false,该方法的返回值未定义。
返回值:返回焦点的 Y 坐标值,以像素为单位。
- public float getPreviousSpan ()
返回手势过程中,组成该手势的两个触点的前一次距离。
返回值:两点的前一次距离,以像素为单位。
- public float getScaleFactor ()
返回从前一个伸缩事件至当前伸缩事件的伸缩比率。该值定义为 (getCurrentSpan() / getPreviousSpan())。
返回值:当前伸缩比率.
- public long getTimeDelta ()
返回前一次接收到的伸缩事件距当前伸缩事件的时间差,以毫秒为单位。
返回值:从前一次伸缩事件起始的时间差,以毫秒为单位。
- public boolean isInProgress ()
如果手势处于进行过程中,返回 true.
- 返回值:如果手势处于进行过程中,返回 true。否则返回 false。
Demo
public class MainActivity extends ActionBarActivity { private ScaleGestureDetector mSGestureDetector; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); mSGestureDetector = new ScaleGestureDetector(this, new MyScaleGestureListener()); } @Override public boolean onTouchEvent(MotionEvent event) { mSGestureDetector.onTouchEvent(event); return super.onTouchEvent(event); } private class MyScaleGestureListener extends SimpleOnScaleGestureListener { @Override public boolean onScale(ScaleGestureDetector detector) { Log.v("x", "onScale"); Log.v("x", "getCurrentSpan" + detector.getCurrentSpan()); Log.v("x", "getPreviousSpan" + detector.getPreviousSpan()); Log.v("x", "getScaleFactor" + detector.getScaleFactor()); Log.v("x", "getEventTime" + detector.getEventTime()); Log.v("x", "getTimeDelta" + detector.getTimeDelta()); return super.onScale(detector); } @Override public boolean onScaleBegin(ScaleGestureDetector detector) { Log.v("x", "onScaleBegin"); return false; } @Override public void onScaleEnd(ScaleGestureDetector detector) { Log.v("x", "onScaleEnd"); super.onScaleEnd(detector); } } }