2013-10-19 26 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尺度不会改变任何东西,所以你在开始时看不到突然的枢轴跳跃。