详解Android手势

来源:互联网 发布:约瑟夫问题c语言 编辑:程序博客网 时间:2024/05/02 02:05

知识点介绍

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 fingersdetector.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        }    }}
0 0
原创粉丝点击