是这样的,我正在研究一个android的多点触屏问题。我知道android在2.0版本以上的sdk中已经提供了对多点触屏的处理函数,这个函数是这样的:event.getPointerCount(); //获取触控点的数量,比如2则可能是两个手指同时按压屏幕
event.getX(nID); //获取第nID个触控点的x位置
event.getY(nID); //获取第nID个点触控的y位置函数很好,我发现的bug在于:当二指触屏时,特别是二指移动引发mov事件时,Event.getX和event.getY取得的x,y坐标会出错。如二指触屏的坐标为(x1,y1)和(x2,y2),实际上坐标值为(50,400)和(280,80)。而用event.getX(0),event.getY(0),event.getX(1),event.getY(1)函数获得的坐标却为(50,80)和(280,400)或者(50,200)和(280,200)。也就是多点触屏的函数获得的x,y坐标的值不准确,这是android的大bug。大家遇到过这种问题吗?

解决方案 »

  1.   

    给WebView弄了一个多点触控缩放的方法,从网上找的,挺好的呀
      

  2.   


    @Override 
        public boolean onTouch(View v, MotionEvent event) { 
            int action = event.getAction() & MotionEvent.ACTION_MASK; 
            int pointerIndex = (event.getAction() & MotionEvent.ACTION_POINTER_ID_MASK) >> MotionEvent.ACTION_POINTER_ID_SHIFT; 
            int pointerId = event.getPointerId(pointerIndex); 
     
            switch (action) { 
            case MotionEvent.ACTION_DOWN: 
            case MotionEvent.ACTION_POINTER_DOWN: 
                touched[pointerId] = true; 
                x[pointerId] = (int)event.getX(pointerIndex); 
                y[pointerId] = (int)event.getY(pointerIndex); 
                break; 
             case MotionEvent.ACTION_UP:           
            case MotionEvent.ACTION_POINTER_UP: 
            case MotionEvent.ACTION_CANCEL: 
                touched[pointerId] = false;  
                x[pointerId] = (int)event.getX(pointerIndex); 
                y[pointerId] = (int)event.getY(pointerIndex); 
                break; 
            case MotionEvent.ACTION_MOVE: 
                int pointerCount = event.getPointerCount(); 
                for (int i = 0; i < pointerCount; i++) { 
                    pointerIndex = i; 
                    pointerId = event.getPointerId(pointerIndex); 
                    x[pointerId] = (int)event.getX(pointerIndex); 
                    y[pointerId] = (int)event.getY(pointerIndex); 
                } 
                break; 
            } 
             
            updateTextView();        
            return true; 
        }要这样获得ID
      

  3.   

    这绝对不是bug是楼主木有用好。我目前木有做过这个,但是很多应用都有这功能,貌似木有bug。你不能直接这样获取坐标,当然需要做一些判定哦。
      

  4.   

    可以看看我的博客,我专门写了两点触摸和多点触控的,http://blog.sina.com.cn/s/blog_8d955f8c0100y2xv.html
      

  5.   

    我的代码是这样的:@Override
    public boolean onTouchEvent(MotionEvent event) {

    float x[]=new float[2];
    float y[]=new float[2];
    /**游戏按键的控制**/
    switch (event.getPointerCount()) {
    case 1:
    switch (event.getAction()) {
    case MotionEvent.ACTION_DOWN:
    x[0]=event.getX();
    y[0]=event.getY();
    Log.i("event", "---down---x[0]="+x[0]+",y[0]="+y[0]+"---");
    return true;
    case MotionEvent.ACTION_MOVE:
    x[0]=event.getX();
    y[0]=event.getY();
    Log.i("event", "move---x[0]="+x[0]+",y[0]="+y[0]);
    return true;
    case MotionEvent.ACTION_UP:
    x[0]=event.getX();
    y[0]=event.getY();
    Log.i("event", "---up---x[0]="+x[0]+",y[0]="+y[0]+"---");
    return true;
    case MotionEvent.ACTION_CANCEL:
    Log.i("event", "-----------cancle----------");
    return super.onTouchEvent(event);
    }
    case 2:
    x[0]=event.getX(0);
    y[0]=event.getY(0);
    x[1]=event.getX(1);
    y[1]=event.getY(1);
    Log.i("event", "multi---x[0]="+x[0]+",y[0]="+y[0]);
    Log.i("event", "multi---x[1]="+x[1]+",y[1]="+y[1]); }
    return super.onTouchEvent(event);
    }其中,在case 2的状态下,x[0],y[0]和x[1],y[1]会出现错误。
      

  6.   


    你的代码中涉及到的多点触屏就是上面这些代码。你认为这样获得的x,y值坐标没有问题?把两点的x,y坐标值打印出来,用手机检测时,触屏的两点滑动,滑动路线的x坐标或y坐标交叉,观察x,y的值是否有错。
      

  7.   

    虽然没研究过这个。。不过最好不要认为google错了。。而且还错了那么久没改。。所以应该是你错了
      

  8.   

    哈哈,我刚工作时候好像也像楼主一样经常会发现很多前人未发现的系统bug.
    结果:100%都是我自己犯的低级错误......
      

  9.   

    别一上来就说android的bug,android要是这么多很容易就发现的bug,还玩个P啊
      

  10.   

    楼主用的不对。针对多点的情况:// 这个不对。
    x[0]=event.getX(0);
    y[0]=event.getY(0);应该是(函数名我有可能拼错):
    int id = event.getPointerId(0);
    x[0] = event.getX(id);
    y[0] = event.getY(id);
      

  11.   

    Mark
    以后可能会遇到类似的问题。