2013-05-18 1 views
0

이미지가 확대되는 위치에서 오류가 발생하지만 두 손가락의 중간 점으로 확대하는 대신 확대 축소됩니다. 원본 그림. 이것은 매우 부 자연스러운 사용자 인터페이스를 생성합니다. 내 onTouchEvent와이미지를 확대/축소 할 때 이미지가 중심이 아닌 모퉁이로 조정됩니다.

@Override 
protected void onDraw(Canvas canvas) { 

    canvas.save(); 
    canvas.translate(mPosX, mPosY); 
    canvas.scale(mScaleFactor, mScaleFactor); 
    super.onDraw(canvas); 
    canvas.restore(); 
} 

의 myScale.onTouch는 (스케일하는 것은 아니고 (PX, 플로트 평을 부동, 플로트 SX, 플로트 SY) 정보를

@Override 
public boolean onTouchEvent(MotionEvent event) { 
    super.onTouchEvent(event); 
    midPoint(mid,event); 
    myScale.onTouchEvent(event); 
    switch (event.getAction() & MotionEvent.ACTION_MASK){ 
      case MotionEvent.ACTION_DOWN: { 
       final float x = event.getX(); 
       final float y = event.getY(); 
       mode=DRAG; 
       // Remember where we started 
       mLastTouchX = x; 
       mLastTouchY = y; 
       mActivePointerId = event.getPointerId(0); 
       break; 
      } 
     case MotionEvent.ACTION_POINTER_DOWN: { 
      final float gx = myScale.getFocusX(); 
      final float gy = myScale.getFocusY(); 
      mLastGestureX=gx; 
      mLastGestureY=gy; 
      mode=ZOOM; 
      break; 
     } 


      case MotionEvent.ACTION_MOVE: { 
       final int pointerIndex = event.findPointerIndex(mActivePointerId); 
       final float x = event.getX(pointerIndex); 
       final float y = event.getY(pointerIndex); 

       // Calculate the distance moved 

      if(!myScale.isInProgress()){ 
        // Move the object 

        final float dx = x - mLastTouchX; 
        final float dy = y - mLastTouchY; 
        mPosX += dx; 
        mPosY += dy; 

        // Remember this touch position for the next move event 


        // Invalidate to request a redraw 
        invalidate(); 

      } 
       mLastTouchX = x; 
       mLastTouchY = y; 

       break; 

      } 

I have deleted action up and action pointer up because they have nothing to do with this problems 





     } 

    invalidate(); 
    return true; 
} 






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




private void midPoint(PointF point, MotionEvent event) { 
    float x = event.getX(0) + event.getX(1); 
    float y = event.getY(0) + event.getY(1); 
    point.set(x/2, y/2); 
} 

private class ScaleListener extends ScaleGestureDetector.SimpleOnScaleGestureListener { 
    @Override 
    public boolean onScale(ScaleGestureDetector detector) { 

     mScaleFactor *= detector.getScaleFactor(); 

     // Don't let the object get too small or too large. 
     mScaleFactor = Math.max(0.1f, Math.min(mScaleFactor, 10.0f)); 
     float currentdist=detector.getCurrentSpan(); 
     float last=detector.getPreviousSpan(); 
     float ratio = currentdist/last; 

     mScaleFactor = Math.max(0.1f, Math.min(mScaleFactor, 5.0f)); 

     Matrix temp = new Matrix(); 
     temp.postScale(ratio, ratio, mid.x,mid.y); 
     temp.preConcat(matrix); 

     matrix=temp; 

     invalidate(); 
     return true; 
    } 
} 
+0

구글이 문서의 무리를 작성합니다. 사람들이 제일 먼저가는 곳이 아니라는 것은 수치스러운 일입니다. http://developer.android.com/reference/android/graphics/Canvas.html#scale(float, float, float, float) – Simon

답변

관련 문제