知识点介绍
Matrix
Matrix:对于图像变换,Android系统也是通过矩阵来进行处理的,每个像素点都表达了其坐标的X、Y信息。
初始化矩阵为:
图像的变化处理通常包含以下四类基本变换:
- Translate –平移变换
- Rotate –旋转变换
- Scale –缩放变换
- Skew – 错切变换
Android使用Matrix类
来封装矩阵,并提供了以下几个操作来实现上面的四种变换方式:
- matriX.setRotate() –旋转变换
- matriX.setTranslate() –平移变化
- matriX.setScale() –缩放变换
- matriX.setSkew() –错切变换
- pre()和post() –提供矩阵的前乘和后乘
最后两个方法常用来实现矩阵的混合运算
参考:Matrix学习2、Matrix的基本三种变换Scale、Translation、Skew
GestureDetector
GestureDetector:通过这个类我们可以识别很多的手势,主要是通过他的onTouchEvent(event)方法完成了不同手势的识别。
如果我们要implements OnGestureListener·
,必须重写6个函数,其中他们在什么情况下会被触发,情况如下:
- OnDown(MotionEvent e):用户按下屏幕就会触发;
- onShowPress(MotionEvent e):如果是按下的时间超过瞬间,而且在按下的时候没有松开或者是拖动的,那么onShowPress就会执行,具体这个瞬间是多久,我也不清楚呃……
onLongPress(MotionEvent e):长按触摸屏,超过一定时长,就会触发这个事件
触发顺序:onDown->onShowPress->onLongPress
onSingleTapUp(MotionEvent e):从名子也可以看出,一次单独的轻击抬起操作,也就是轻击一下屏幕,立刻抬起来,才会有这个触发,当然,如果除了Down以外还有其它操作,那就不再算是Single操作了,所以也就不会触发这个事件
触发顺序:
点击一下非常快的(不滑动)Touchup:onDown->onSingleTapUp->onSingleTapConfirmed
点击一下稍微慢点的(不滑动)Touchup:
onDown->onShowPress->onSingleTapUp->onSingleTapConfirmed
- onFling(MotionEvent e1, MotionEvent e2, float velocityX,float velocityY) :滑屏,用户按下触摸屏、快速移动后松开,由1个MotionEvent ACTION_DOWN, 多个ACTION_MOVE, 1个ACTION_UP触发
参数解释:
e1:第1个ACTION_DOWN MotionEvent
e2:最后一个ACTION_MOVE MotionEvent
velocityX:X轴上的移动速度,像素/秒
velocityY:Y轴上的移动速度,像素/秒 onScroll(MotionEvent e1, MotionEvent e2,float distanceX, float distanceY):在屏幕上拖动事件。无论是用手拖动view,或者是以抛的动作滚动,都会多次触发,这个方法 在ACTION_MOVE动作发生时就会触发
滑屏:手指触动屏幕后,稍微滑动后立即松开onDown—–》onScroll—-》onScroll—-》onScroll—-》………—–>onFling
拖动
onDown——》onScroll—-》onScroll——》onFiling
注意点: MotionEvent.ACTION_DOWN和onDown的区别,都是由也就是说当用户点击的时候,首先MotionEventACTION_DOWN,onDown就会执行
参考:用户手势操作
ScaleGestureDetector
ScaleGestureDetector:是唯一的一个多点触控手势识别api,识别来那个手指(或多个手指)陪着而造成的旋转。虽然用onTouch也可以实现,但是用android.view.ScaleGestureDetector
更优雅。
public class TouchActivity extends Activity implements OnTouchListener
private float mScaleSpan = 1.0f;
private ScaleGestureDetector mScaleDetector;
...
public boolean onTouch(View v, MotionEvent event) {
mScaleDetector.onTouchEvent(event);
// 在这里通过mScaleSpan 的值来完成你想要的操作
// Perform your magic with mScaleSpan now!
...
return true; // indicate event was handled
}
private class ScaleListener extends ScaleGestureDetector.SimpleOnScaleGestureListener {
@Override
public boolean onScale(ScaleGestureDetector detector) {
//返回的始终是两个手指之间的距离
mScaleSpan = detector.getCurrentSpan(); // average distance between fingers
detector.getCurrentSpan();//两点间的距离跨度
detector.getCurrentSpanX();//两点间的x距离
detector.getCurrentSpanY();//两点间的y距离
detector.getFocusX(); //
detector.getFocusY(); //
detector.getPreviousSpan(); //上次
detector.getPreviousSpanX();//上次
detector.getPreviousSpanY();//上次
detector.getEventTime(); //当前事件的事件
detector.getTimeDelta(); //两次事件间的时间差
detector.getScaleFactor(); //与上次事件相比,得到的比例因子
return true; // indicate event was handled
}
}
}