2012-02-20 118 views
1

我已经实现变焦和阻力functionalities.I的形象图现在用矩阵的缩放和拖动functionality.But我的问题是,我不能把我的最小和最大缩放级别以及拖放空间限制。可以告诉我如何才能做到这一点。有放大和缩小,拖动与最大和最小水平ImageView的问题

private float spacing(MotionEvent event) { 
     float x = event.getX(0) - event.getX(1); 
     float y = event.getY(0) - event.getY(1); 
     return FloatMath.sqrt(x * x + y * y); 
    } 

    private void midPoint(PointF point, MotionEvent event) { 
     float x = event.getX(0) + event.getX(1); 
     float y = event.getY(0) + event.getY(1); 
     point.set(x/2, y/2); 
    } 

    private float spacing(PointF start,PointF end) 
    { 
      float x = end.x- start.x; 
      float y = end.y -start.y; 

      return FloatMath.sqrt(x * x + y * y); 
    } 

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

     float scale; 


     switch (event.getAction() & MotionEvent.ACTION_MASK) { 

     case MotionEvent.ACTION_DOWN: 

      savedMatrix.set(matrix); 
      start.set(event.getX(), event.getY()); 
      Log.d(TAG, "mode=DRAG"); 
      mode = DRAG; 

      break; 
     case MotionEvent.ACTION_UP: 

      if(mode==DRAG) 
      { 
       PointF end=new PointF(); 
       end.set(event.getX(), event.getY()); 

       Log.d("Fling", "Inside the Action Key UP"+spacing(start, end)); 

       float []x = new float[9],org=new float[9]; 

       matrix.getValues(x); 
       orgMatrix.getValues(org); 

       Log.d("Fling", "matrixValue"+matrix); 
       Log.d("Fling", "OrgmatrixValue"+orgMatrix); 

       float matrixSizex=x[Matrix.MSCALE_X]; 
       float matrixSizey=x[Matrix.MSCALE_Y]; 


       float matrixOrgSizex=org[Matrix.MSCALE_X]; 
       float matrixOrgSizey=org[Matrix.MSCALE_Y]; 

       if(Math.abs(matrixOrgSizex-matrixSizex)<0.17f&&Math.abs(matrixOrgSizey-matrixSizey)<0.17f) 
       { 
        Log.d("Fling", "Current Size is equal"); 
        if(spacing(start, end)>30.f) 
        { 
         if((start.x>end.x+30)&&(Math.abs(start.y-end.y)<50.0f)) 
         { 
          Log.d("Fling", "Is From Right To left"); 
          loadedimage.setImageMatrix(orgMatrix); 
          leftSwipe(); 
          view.setScaleType(ImageView.ScaleType.FIT_XY); 
         } 
         else if((end.x>start.x+30)&&(Math.abs(end.y-start.y)<50.0f)) 
         { 
          Log.d("Fling", "Is From Left To Right");       
          loadedimage.setImageMatrix(orgMatrix); 
          rightSwipe(); 
          view.setScaleType(ImageView.ScaleType.FIT_XY); 
         } 
        } 
       } 
      } 
     case MotionEvent.ACTION_POINTER_UP: //second finger lifted 
      mode = NONE; 
      Log.d(TAG, "mode=NONE"); 
      break; 
     case MotionEvent.ACTION_POINTER_DOWN: //second finger down 
      oldDist = spacing(event); 
      Log.d(TAG, "oldDist=" + oldDist); 
      if (oldDist > 5f) { 
      savedMatrix.set(matrix); 
      midPoint(mid, event); 
      mode = ZOOM; 
      Log.d(TAG, "mode=ZOOM"); 
      } 
      break; 

     case MotionEvent.ACTION_MOVE: 
      if (mode == DRAG) { 

       //movement of first finger 
       PointF end=new PointF(); 
       end.set(event.getX(), event.getY()); 

       Log.d("Fling", "Inside the Action Key UP"+spacing(start, end)); 

       float []x = new float[9],org=new float[9]; 

       matrix.getValues(x); 
       orgMatrix.getValues(org); 

       Log.d("Fling", "matrixValue"+matrix); 
       Log.d("Fling", "OrgmatrixValue"+orgMatrix); 

       float matrixSizex=x[Matrix.MSCALE_X]; 
       float matrixSizey=x[Matrix.MSCALE_Y]; 


       float matrixOrgSizex=org[Matrix.MSCALE_X]; 
       float matrixOrgSizey=org[Matrix.MSCALE_Y]; 

       if(Math.abs(matrixOrgSizex-matrixSizex)>=0.17f&&Math.abs(matrixOrgSizey-matrixSizey)>=0.17f) 
       { 

        matrix.set(savedMatrix); 

        if (view.getLeft() >= 0) 
        { 
         matrix.postTranslate(event.getX() - start.x, event.getY() - start.y); 
        } 
       } 
      } 
      else if (mode == ZOOM) { //pinch zooming 
      float newDist = spacing(event); 
      Log.d(TAG, "newDist=" + newDist); 
      if (newDist > 5f) { 
       matrix.set(savedMatrix); 
       scale = newDist/oldDist; //thinking i need to play around with this value to limit it** 
       matrix.postScale(scale, scale, mid.x, mid.y); 
      } 
      } 
      break; 
     } 

     // Perform the transformation 
     view.setImageMatrix(matrix); 

     return true; // indicate event was handled 
} 

我的样本代码是在这里任何一个可以帮助我在设定最低和最高缩放,拖动level.I也有问题,当我触碰查看图像中进行换算时,矩阵我不能让它自动获得放大它保持健康的设备screen.I这里我完全卡住........

回答

3

要限制缩放我比较单位矩阵缩放矩阵,如果它小于不把它分配给我的ImageView单位矩阵,在这种情况下,我将缩放矩阵重置回单位矩阵。我使用的是单声道的Android,但我想这将是几乎相同的在Java中:

 //check that zoom is not too small 
     if (Utils.SmallerThanIdentity(matrix)) 
     { 
     ResetView(v); 
     } 

凡SmallerThanIdentity实现:

public static bool SmallerThanIdentity(Android.Graphics.Matrix m) 
{ 
    float[] values = new float[9]; 
    m.GetValues(values); 

    return ((values[0] < 1.0) || (values[4] < 1.0) || (values[8] < 1.0)); 
} 

而这里的ResetView。我为Java代码:

public void resetView(View v) 
{ 
    ImageView view = (ImageView)v; 
    matrix = new Matrix(); 

    view.setScaleType(ImageView.ScaleType.MATRIX); 
    view.setImageMatrix(matrix); 
} 

关于滚动,我的矩阵转换的地方,我想限制滚动的区域之前使用下面的方法ShouldScroll。

private bool ShouldScroll(Android.Graphics.Matrix matrix) 
{ 
    float[] values = new float[9]; 
    matrix.GetValues(values); 

    float[] oldValues = new float[9]; 
    oldMatrix.GetValues(oldValues); 

    float zoomPercentX = values[0]/oldValues[0]; 
    float zoomPercentY = values[4]/oldValues[4]; 

    float tmpW = -(this.Drawable.IntrinsicWidth/2) * zoomPercentX; 
    float tmpH = -(this.Drawable.IntrinsicHeight/2) * zoomPercentY; 

    return (values[2] < 0.0f) && (values[2] > tmpW) && //horizontal coordinates 
      (values[5] < 0.0f) && (values[5] > tmpH); //vertical coordinates 
} 
+0

感谢它帮助我... – 2012-12-28 05:29:34

+0

感谢Narcis,它帮助我... – 2013-05-01 10:07:45