2012-02-20 7 views
1

ズーム機能とドラッグ機能で画像ビューを実装しました。ズーム機能とドラッグ機能を使用しています。私の問題は、最小と最大のズームレベルとドラッグスペースの制限。どのように私はそれを行うことができます私に教えてください。ズームインとズームアウトによる画像ビューの問題、最大値と最小値のドラッグ

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をドラッグすることができ、ここでそれはデバイスの画面に収まります。私は完全にここにこだわっています........

答えて

3

ズームを制限するには、ズームマトリックスとアイデンティティマトリックスを比較し、小さい場合はImageViewに割り当てませんこの場合、スケールされた行列を恒等行列に戻します。私は、Androidのためのモノを使用していますが、私はそれがJavaでほぼ同じになると思います。

SmallerThanIdentityが実装されている
 //check that zoom is not too small 
     if (Utils.SmallerThanIdentity(matrix)) 
     { 
     ResetView(v); 
     } 

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です。私はスクロールを制限したい領域に行列を変換する前に、下のShouldScrollメソッドを使用し、スクロールについて

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

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

:私はそのためのJavaコードを持っています。

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

感謝します。それは私を助けました... –

+0

ナルシス、ありがとう、それは私を助けました... –

関連する問題