2017-06-18 1 views
-1

Je suis en train de développer dessiner quelque chose sur l'image lorsque l'image zoom dans mon projet, mais lorsque le zoom alors il va créer un certain décalage entre le toucher et le dessin, mais sans zoom, il fonctionne parfaitement. Par exemple. enter image description hereComment dessiner sur une image en utilisant le doigt lorsque l'image est agrandie?

Code pour l'image zoom:

@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; 
    } 

code pour le dessin:

@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(); 
    } 

peut me aider pour la façon de gérer le facteur d'échelle ou comment supprimer le zoom d'image facteur d'échelle dans le toucher du doigt.

Répondre

0

Vous stockez généralement le facteur d'échelle, et multiplie plusieurs de vos coordonnées gérer le système par sa valeur.

Tout simplement comme cela.