2013-10-19 45 views
3

我想在視圖中同時使用scalegesture偵聽器和gesturelistener。如果比例爲1,則一切正常,但如果將比例設置爲某個其他值,則圖像會跳至新的位置,然後平穩地縮放。我的代碼canvas.scale(scale,scale,px,py)抽搐到一個新位置

部分看起來像如下:

public class SimpleView extends View { 

Bitmap image; 
ScaleGestureDetector scaleGesture; 
GestureDetector gestures; 
float touchX, touchY; 
float horizontalOffset; 
float verticalOffset; 
float scale; 

public SimpleView(Context context) { 
    super(context); 
    image = BitmapFactory.decodeResource(getResources(), R.drawable.some_image); 
    scaleGesture = new ScaleGestureDetector(getContext(), 
      new ScaleListener()); 
    gestures = new GestureDetector(getContext(), new GestureListener(), 
      null, true); 
    scale = 0.6f; //if this is set to 1.0f everything works perfectly, 
      // else the imagetransports to a new position 
      // and scales perfectly thereafter 
} 

@Override 
protected void onDraw(Canvas canvas) { 
    canvas.save(); 
    canvas.translate(horizontalOffset, verticalOffset); 
    canvas.scale(scale, scale, touchX, touchY); 
    canvas.drawBitmap(image, getMatrix(), new Paint); 
    canvas.restore(); 
} 

public class ScaleListener implements OnScaleGestureListener { 
    @Override 
    public boolean onScale(ScaleGestureDetector detector) { 
     float oldScale = scale; 
     scale *= detector.getScaleFactor(); 
     scale = Math.max(0.5f, Math.min(scale, 5.0f)); 

     if (scale != oldScale) { 
      touchX = detector.getFocusX(); 
      touchY = detector.getFocusY(); 

      invalidate(0, 0, screenWidth, screenHeight); 
     } 
     return true; 
    } 

} 

public class GestureListener implements OnGestureListener { 
    @Override 
    public boolean onScroll(MotionEvent e1, MotionEvent e2, 
      float distanceX, float distanceY) { 
        //Helps in drag 
     if (!scaleGesture.isInProgress()) { 
      horizontalOffset -= distanceX; 
      verticalOffset -= distanceY; 

      invalidate(); 
      return true; 
     } 
     return false; 
    } 

} 

@Override 
public boolean onTouchEvent(MotionEvent event) { 
    boolean result = scaleGesture.onTouchEvent(event); 
    boolean isScaling = result = scaleGesture.isInProgress(); 
    if (!isScaling) { 
     if (!(event.getPointerCount() > 1)) { 
      result = gestures.onTouchEvent(event); 
     } else 
      result = false; 
    } 
    return result; 
} 

} 

萬一我刻度值設置爲1.0F,該工程進展順利。當我將比例值改爲(比如)0.6f時,它會轉移到一個新的位置,然後完美地工作。

回答

3

請參閱@ToreRudberg的答案here - 您可能需要改進代碼以糾正您的觀察行爲。

1

這是因爲你的縮放旋轉COORDS(touchX和敏感的)最初是0,並且在第一次大規模,突然他們變爲規模手勢的焦點:

 touchX = detector.getFocusX(); 
     touchY = detector.getFocusY(); 

它與1.0初始尺度,因爲1.0f尺度不會改變任何東西,所以你在開始時看不到突然的樞軸跳躍。