2017-06-18 157 views
-1

我试图在图像放大时在图像上绘制某些东西,但是当放大时,它会在触摸和绘图之间创建一些偏移,但没有缩放,它工作得很完美。例如。 enter image description here如何在图像缩放时使用手指绘制图像?

代码的图像变焦:

@Override 
    protected void onDraw(Canvas canvas) { 
     super.onDraw(canvas); 

     canvas.concat(matrix); 
     .... 
    } 

@Override 
    public boolean onTouch(View v, MotionEvent event) { 
     ImageView view = (ImageView) v; 

     switch (event.getAction() & MotionEvent.ACTION_MASK) { 
      case MotionEvent.ACTION_DOWN: 
       savedMatrix.set(matrix); 
       start.set(event.getX(), event.getY()); 
       mode = DRAG; 
       lastEvent = null; 
       break; 

      case MotionEvent.ACTION_POINTER_DOWN: 
       oldDist = spacing(event); 
       if (oldDist > 10f) { 
        savedMatrix.set(matrix); 
        midPoint(mid, event); 
        mode = ZOOM; 
       } 
       lastEvent = new float[4]; 
       lastEvent[0] = event.getX(0); 
       lastEvent[1] = event.getX(1); 
       lastEvent[2] = event.getY(0); 
       lastEvent[3] = event.getY(1); 
       d = rotation(event); 
       break; 

      case MotionEvent.ACTION_UP: 
      case MotionEvent.ACTION_POINTER_UP: 
       mode = NONE; 
       lastEvent = null; 
       break; 

      case MotionEvent.ACTION_MOVE: 
       if (mode == DRAG) { 
        matrix.set(savedMatrix); 
        matrix.postTranslate((event.getX() - start.x), (event.getY() - start.y)); 
       } else if (mode == ZOOM && event.getPointerCount() == 2) { 
        float newDist = spacing(event); 
        matrix.set(savedMatrix); 
        if (newDist > 10f) { 
         float scale = newDist/oldDist; 
         matrix.postScale(scale, scale, mid.x, mid.y); 
        } 
        if (lastEvent != null) { 
         float newRot = rotation(event); 
         float r = newRot - d; 
         matrix.postRotate(r, view.getMeasuredWidth()/2, view.getMeasuredHeight()/2); 
        } 
       } 
       break; 
     } 
     invalidate(); 

     return true; 
    } 

代码绘制:

@Override 
    public boolean onTouch(View view, MotionEvent event) { 

     float x = event.getX(); 
     float y = event.getY(); 

     switch (event.getAction()) { 
      case MotionEvent.ACTION_DOWN: 
       touchStart(x, y); 
       invalidate(); 
       break; 
      case MotionEvent.ACTION_MOVE: 
       touchMove(x, y); 
       invalidate(); 
       break; 
      case MotionEvent.ACTION_UP: 
       touchEnd(); 
       invalidate(); 
       break; 
     } 

     return true; 
    } 

    private void touchMove(float x, float y) { 
     float f1 = Math.abs(x - mX); 
     float f2 = Math.abs(y - mY); 
     if ((f1 >= 4.0F) || (f2 >= 4.0F)) { 
      path.quadTo(mX, mY, 
        (x + mX)/2.0F, 
        (y + mY)/2.0F); 
      mX = x; 
      mY = y; 
     } 
    } 

    private void touchStart(float x, float y) { 
     path.reset(); 
     path.moveTo(x, y); 
     blurView.pathList.add(path); 
     blurView.strokeWidthList.add(strokeWidth); 
     mX = x; 
     mY = y; 
    } 

    private void touchEnd() { 
     path.lineTo(mX, mY); 
     path = new Path(); 
    } 

任何一个可以帮我要如何处理的比例因子或如何删除图像放大缩放因子进入手指触摸。

回答

0

您通常会存储比例因子,并将许多坐标处理系统乘以其值。

就是这样。