2012-11-11 3 views
0

API 레벨 7에 대해 멀티 터치 제스처 감지를 구현하려고합니다. 즉, ScaleGestureDetector가 없습니다. 순간 나는 이런 식으로 뭔가를 가지고 있지만 그것은 잘 작동하지 않습니다와 나는 완전한 이해 때보 다 더 많은 개방 질문 : 모든 것은 정말 형편없는 노력ScaleGestureDetector를 사용하지 않고 눈금 감지 및 제스처 번역

public boolean onTouchEvent(MotionEvent ev) 
{ 
    final int action = ev.getAction(); 
    switch (action & MotionEvent.ACTION_MASK) // why mask it with ACTION_MASK? 
    { 
     case MotionEvent.ACTION_DOWN: 
     { 
     mLastTouchX=ev.getX(); 
     mLastTouchY=ev.getY(); 
     mActivePointerId = ev.getPointerId(0); 
     break;    
     } 
    case MotionEvent.ACTION_POINTER_DOWN: 
    { 
     mLastTouchX2=ev.getX(); 
     mLastTouchY2=ev.getY(); 
     if (ev.getPointerCount()>1) 
     mActivePointerId2 = ev.getPointerId(1); 
     break; 
    } 
    case MotionEvent.ACTION_MOVE: 
    { 
     int pointerIndex; 
     float x=0.0f,y=0.0f; 

     try 
     { 
      if ((mActivePointerId!=INVALID_POINTER_ID) || (mActivePointerId2!=INVALID_POINTER_ID)) 
      { 
       // get one of the active pointers - unfortunately here I'm not sure which one is the active one so I only can guess 
       pointerIndex= ev.findPointerIndex(mActivePointerId); 
       x= ev.getX(pointerIndex); 
       y= ev.getY(pointerIndex); 
      } 
      if ((mActivePointerId!=INVALID_POINTER_ID) && (mActivePointerId2!=INVALID_POINTER_ID)) 
      { 
       float d1,d2; 

       pointerIndex = ev.findPointerIndex(mActivePointerId2); 
       if (pointerIndex<0) return false; 
       float x2 = ev.getX(pointerIndex); 
       float y2 = ev.getY(pointerIndex); 

       d1=android.util.FloatMath.sqrt((x-x2)*(x-x2)+(y-y2)*(y-y2)); 
       d2=android.util.FloatMath.sqrt((mLastTouchX-mLastTouchX2)*(mLastTouchX-mLastTouchX2)+ 
            (mLastTouchY-mLastTouchY2)*(mLastTouchY-mLastTouchY2));     

       if ((d1>0) && (d2>0)) // seems to be a scale gesture with two pointers 
       { 
       float w,h,s; 

       transOffsetX=0.0f; 
       transOffsetY=0.0f; 
       s=d1/d2; 
       mScaleFactor*=s; 
       matrix.postScale(s,s); 
       w=(scrWidth-(scrWidth*s))/2.0f; 
       h=(scrHeight-(scrHeight*s))/2.0f; 

       matrix.postTranslate(w,h); 
       imgOffsetX+=w; 
       imgOffsetY+=h;          
       } 

       mLastTouchX2 = x2; 
       mLastTouchY2 = y2; 
      } 
      else if (mScaleFactor==1.0) // seems to be a translate gesture with only one pointer 
      { 
       mScaleFactor=1.0f; 
       transOffsetX+=(x-mLastTouchX); 
       transOffsetY+=(y-mLastTouchY); 
       matrix.setTranslate(transOffsetX,transOffsetY); 
      } 

      if ((mActivePointerId!=INVALID_POINTER_ID) || (mActivePointerId2!=INVALID_POINTER_ID)) 
      {    
       mLastTouchX = x; 
       mLastTouchY = y; 
      } 
     } 
     catch (ArrayIndexOutOfBoundsException aioobe) 
     { 
      // this is really strange, this exception can be caused by 
      // pointerIndex= ev.findPointerIndex(mActivePointerId); 
      // x= ev.getX(pointerIndex); 
      // above which seems to be a Android bug? 
     } 
     break; 
    } 
    case MotionEvent.ACTION_UP: 
    case MotionEvent.ACTION_POINTER_UP: 
    { 
     breakMapThread=true; 
     mActivePointerId = INVALID_POINTER_ID; 
     mActivePointerId2 = INVALID_POINTER_ID; 

     // gestrue seems to be finished so trigger update of the view here 
     ... 

     break; 
    } 
    }  
    return true; 

}

. 축척 제스처로 인해 추가로 높은 번역이 발생하고 뷰를 한 번 탭하면 번역이 이루어지며 번역은 정확하지 않습니다. 그 외에는 결코 사용되지 않는 것으로 보이는 몇 가지 모션 이벤트 상수 ACTION_POINTER_1/2/3_DOWN/UP을 발견했습니다. 그래서 포인터 1과 2에 대한 내 할당 양식 _DOWN/_UP이 맞는지 확실하지 않습니다.

모든 아이디어, 힌트, 팁이 작동하도록하려면?

답변

0

하나의 아이디어는 ScaleGestureDetector의 소스를 찾아 프로젝트에 포함시키는 것입니다. 그러나 문제가 있습니다 : 때때로 시스템이 클릭 및 longclick을 감지합니다 (특히 손가락이 창 경계를 벗어나는 경우).

관련 문제