您的位置:首页 > 移动开发 > Android开发

自学——关于实现双指缩放的学习总结

2016-06-03 19:40 281 查看
1.    首先你需要自定义OnTouchListener方法,重写OnTouch方法;

2.    在这里面你需要用switch语句去判断触发了哪些事件:

ü  MotionEvent.ACTION_DOWN:在第一个点被按下时触发

ü  MotionEvent.ACTION_UP:当屏幕上唯一的点被放开时触发

ü  MotionEvent.ACTION_POINTER_DOWN:当屏幕上已经有一个点被按住,此时再按下其他点时触发。

ü  MotionEvent.ACTION_POINTER_UP:当屏幕上有多个点被按住,松开其中一个点时触发(即非最后一个点被放开时)。

ü  MotionEvent.ACTION_MOVE:当有点在屏幕上移动时触发。值得注意的是,由于它的灵敏度很高,而我们的手指又不可能完全静止(即使我们感觉不到移动,但其实我们的手指也在不停地抖动),所以实际的情况是,基本上只要有点在屏幕上,此事件就会一直不停地被触发。

并且要实现捕捉多指触碰的事件,必须要用event.getAction()&MotionEvent.ACTION_MASK来判断MotionEvent.ACTION_POINTER_DOWN和MotionEvent.ACTION_POINTER_UP,因为它的设计原理就是相与后的结果小于MotionEvent.ACTION_MASK则会触发MotionEvent.ACTION_POINTER_DOWN或者MotionEvent.ACTION_POINTER_UP,它是根据这个来判断的,所以必须要这么写!

switch (event.getAction()&MotionEvent.ACTION_MASK){
    case MotionEvent.ACTION_DOWN:
        points = 1;
        break;
    case MotionEvent.ACTION_UP:
        points = 0;
        break;
    case MotionEvent.ACTION_POINTER_DOWN:
        points += 1;
        oldDistance = spacing(event);
        break;
    case MotionEvent.ACTION_POINTER_UP:
        points -= 1;
        break;
    case MotionEvent.ACTION_MOVE:
        if (points >= 2){
            float newDistance = spacing(event);
            if (newDistance > oldDistance+1){
                scaleImage(newDistance/oldDistance);
                oldDistance = newDistance;
            }
            if (newDistance < oldDistance-1){
                scaleImage(newDistance/oldDistance);
                oldDistance = newDistance;
            }
        }
        break;
}

3.    看以上代码,在MotionEvent.ACTION_POINTER_DOWN时计算旧的两指间的距离

float spacing(MotionEvent event){
    float x = event.getX(0)-event.getX(1);
    float y = event.getY(0)-event.getY(1);
    return (float) Math.sqrt(x*x+y*y);
}

        其中getX()或getY()方法里的参数代表着第几个触摸屏幕的点,在这里只用到了两个点,所以无论是几个手指触碰只判断两个点的距离。其中points是代表着当前是几点触摸,然后在MotionEvent.ACTION_MOVE时判断是几点触碰,如果大于或等于两点就去执行变换图片缩放度的操作,同时更新oldDistance。

4.    缩放操作

void scaleImage(float scale){
    float scaleX = viewScaleX*scale;
    float scaleY = viewScaleY*scale;
    if (scaleX>2.5||scaleX<0.5||scaleY>2.5||scaleY<0.5){
        return;
    }
    mView.setScaleX(scaleX);
    mView.setScaleY(scaleY);
}

其中要注意的是,setScaleX()或者getScaleY()方法里的参数不能仅仅是“简单的”比例就行了,这个比例必须是结合要缩放组件的实际大小之后计算出的比例,上面的viewScaleX和viewScaleY代表着组件实际的scale:

viewScaleX = mView.getScaleX();
viewScaleY = mView.getScaleY();

你想要缩放的比例*它原始的比例才是你需要给他设置的scale。否则的话会造成缩放抖动的厉害!!

最后一点,上面的if语句是为了设置所能缩放的最大和最小尺度!!

5.    为要实现缩放的组件设置自定义的监听器即可!!!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息