捏缩放不要缩放

时间:2014-07-23 10:52:44

标签: android xamarin zoom android-canvas

我试图捏一下缩放图像视图。问题是,当我缩放它时,它不会缩放到我捏的地方,它会向上扩展到左角。我不知道为什么我这样做,我似乎有很多人有同样的问题,但我还没有找到它的解决方案。

  public override bool OnTouchEvent(MotionEvent ev)
   {
    _scaleDetector.OnTouchEvent(ev);

MotionEventActions action = ev.Action & MotionEventActions.Mask;
int pointerIndex;

switch (action)
{
    case MotionEventActions.Down:
    _lastTouchX = ev.GetX();
    _lastTouchY = ev.GetY();
    _activePointerId = ev.GetPointerId(0);
    break;

    case MotionEventActions.Move:
    pointerIndex = ev.FindPointerIndex(_activePointerId);
    float x = ev.GetX(pointerIndex);
    float y = ev.GetY(pointerIndex);
    if (!_scaleDetector.IsInProgress)
    {
        // Only move the ScaleGestureDetector isn't already processing a gesture.
        float deltaX = x - _lastTouchX;
        float deltaY = y - _lastTouchY;
        _posX += deltaX;
        _posY += deltaY;
        Invalidate();
    }

    _lastTouchX = x;
    _lastTouchY = y;
    break;

    case MotionEventActions.Up:
    case MotionEventActions.Cancel:
    // We no longer need to keep track of the active pointer.
    _activePointerId = InvalidPointerId;
    break;

    case MotionEventActions.PointerUp:
    // check to make sure that the pointer that went up is for the gesture we're tracking. 
    pointerIndex = (int) (ev.Action & MotionEventActions.PointerIndexMask) >> (int) MotionEventActions.PointerIndexShift;
    int pointerId = ev.GetPointerId(pointerIndex);
    if (pointerId == _activePointerId)
    {
        // This was our active pointer going up. Choose a new
        // action pointer and adjust accordingly
        int newPointerIndex = pointerIndex == 0 ? 1 : 0;
        _lastTouchX = ev.GetX(newPointerIndex);
        _lastTouchY = ev.GetY(newPointerIndex);
        _activePointerId = ev.GetPointerId(newPointerIndex);
    }
    break;

}
return true;

}

  protected override void OnDraw(Canvas canvas)
 {
base.OnDraw(canvas);
canvas.Save();
canvas.Translate(_posX, _posY);
canvas.Scale(_scaleFactor, _scaleFactor, _lastTouchX, _lastTouchY);
_icon.Draw(canvas);
canvas.Restore();
}

我认为在类的开头可能与此代码有关,其中图像的边界设置为0.但是如果我删除该代码,图像将不会呈现。

public GestureRecognizer(Context context, ImageView imgview)
        : base(context, null, 0)
    {
        //_icon = context.Resources.GetDrawable(Resource.Drawable.ic_launcher);
        _icon = imgview.Drawable;
        _icon.SetBounds(0, 0, _icon.IntrinsicWidth, _icon.IntrinsicHeight);
        _scaleDetector = new ScaleGestureDetector(context, new MyScaleListener(this));
    }

1 个答案:

答案 0 :(得分:0)

查看MultiTouchController库。它使得为Android编写多点触控应用程序变得更加容易,并且可以很好地实现缩放,旋转和拖动。这是link