2013-05-18 43 views
0

所以我遇到了一個圖像會縮放的錯誤,但不是放大到我的兩個手指的中點,它會縮小到角落原始圖片。這會創建一個非常不自然的用戶界面。當縮放ImageView時,圖像縮放到角落,而不是中心

@Override 
protected void onDraw(Canvas canvas) { 

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

用我的onTouchEvent,該myScale.onTouch將程序發送到scaleListener縮放信息

@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

回答