安卓放大手势缩小手势算法(开源控件ZhxGesture)

对于新手来说怎么写个缩放的手势算法可能是个有点上头的问题,这里我介绍一下我写的一个缩放算法逻辑,感觉挺清晰明了,你只需要还记得高中的一些三角函数与平面坐标系知识就够了。言归正传先上代码。

private void OnTouchClick(View v,MotionEvent event){
        switch (event.getAction() & MotionEvent.ACTION_MASK) {
            case MotionEvent.ACTION_DOWN:
                dx1 = (int) event.getX(0);
                dy1 = (int) event.getY(0);
                break;
            case MotionEvent.ACTION_POINTER_DOWN:
                if (event.getPointerCount() == 2){
                    dx2 = (int) event.getX(1);
                    dy2 = (int) event.getY(1);
                    if (eventCallBack != null) eventCallBack.down(dx1,dy1,dx2,dy2);
                }
                break;
            case MotionEvent.ACTION_MOVE:
                if (event.getPointerCount() == 2){
                    mx1 = (int) event.getX(0);
                    my1 = (int) event.getY(0);
                    mx2 = (int) event.getX(1);
                    my2 = (int) event.getY(1);
                    if (eventCallBack != null) {
                        int r = (int) (Subtract(mx1,my1,mx2,my2) - Subtract(dx1,dy1,dx2,dy2));
                        int t = (int) Math.sqrt((r*r)/2);
                        if (r < 0){
                            t = t*-1;
                        }
                        eventCallBack.callback(t,t);
                        eventCallBack.move(mx1,my1,mx2,my2);
                    }
                }
                break;
            case MotionEvent.ACTION_UP:
                if (eventCallBack != null){
                    eventCallBack.up(ux1,uy1,ux2,uy2);
                }
                break;
        }
    }

平面坐标系俩点距离差

  private double Subtract(int x1, int y1, int x2, int y2) {
        int w = x2 - x1;
        int h = y2 - y1;
        if (w < 0) w = w * -1;
        if (h < 0) h = h * -1;
        double res = Math.sqrt(w * w + h * h);
        return res;
    }

好的就这么点代码,就可以完成了常用的比如图片的缩放效果,我们现在来讲解一下。
这里说一下 带d的表示按下的记录的坐标 带m的表示移动时候的坐标。
先介绍一下 ACTION_POINTER_DOWN 这个,这个的意思是说当我们按下超过第一个手指的时候会触发这个,但是注意注意注意我们要想使用这个一定要将actionMotionEvent.ACTION_MASK进行计算即(event.getAction() & MotionEvent.ACTION_MASK)如果你看过源码,也会注意到这一点。
首先我们在ACTION_DOWN中记录下第一根手指按下的坐标,在ACTION_POINTER_DOWN中记录第二根手指按下的坐标,这里我们都进行了手指的判断,这样我们就能避免出现三根手指或以上情况的干扰。
其次关键运算我们就在MOVE中进行了,我们在MOVE中首先判断是否是俩根手指,然后不断的取出俩根手指的坐标,与按下俩根手指的坐标进行计算,那么这里我们是怎样进行计算的呢?先说开始我们按下的俩根手指的俩个坐标可以构成一个四边形,我们计算出他们的对角线的长度,然后在我们的MOVE移动中也会不断产生新的俩个坐标点,他们依旧可以构成一个四边形,我们依旧去计算他的对角线长度,当我们MOVE的对角线长度大于DOWN的对角线长度说明是进行了手势放大操作,否则就是缩小操作。那么下一个问题我们怎么计算出放大或缩小了多少,这里我们把MOVE的对角线长度减去DOWN的对角线长度,然后除2,再就行勾股定理的三角函数预算(当做等边三角形处理得到了宽高)这里的宽高我们任意取,就是我们的需要放大或者缩小大小。(正数表示放大,负数表示缩小)。
经过试验来说这样的方式得到的数据来进行图片的缩放操作,效果还是可以的。

最后给出我们的手势库github地址,如果你有需要,你只需要去监听你想要监听的手势就可以,不需要再去写任何算法,和监听单击事件一样简单。并且开源库支持惯性活动摩擦算法。
ZhxGesture
ZhxGesture

发布了18 篇原创文章 · 获赞 2 · 访问量 156

猜你喜欢

转载自blog.csdn.net/weixin_41078100/article/details/104327761