2014-01-30 48 views

回答

0

這種程度的變量的值。爲了移動和縮放時我們將在ImageView的類稱爲矩陣變換使用一個整潔的小特徵的圖像。使用矩陣,我們可以代表任何類型的平移,旋轉或傾斜,我們想要做的圖像

// These matrices will be used to move and zoom image 
    Matrix matrix = new Matrix(); 
    Matrix savedMatrix = new Matrix(); 

    // We can be in one of these 3 states 
    static final int NONE = 0; 
    static final int DRAG = 1; 
    static final int ZOOM = 2; 
    int mode = NONE; 

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

     // Dump touch event to log 
     dumpEvent(event); 

     // Handle touch events here... 
     switch (event.getAction() & MotionEvent.ACTION_MASK) { 
     } 

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

     return true; // indicate event was handled 
    } 

而在手勢

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: 
    case MotionEvent.ACTION_POINTER_UP: 
     mode = NONE; 
     Log.d(TAG, "mode=NONE"); 
     break; 
    case MotionEvent.ACTION_MOVE: 
     if (mode == DRAG) { 
     matrix.set(savedMatrix); 
     matrix.postTranslate(event.getX() - start.x, 
     event.getY() - start.y); 
     } 
     break; 
} 

需要用Matrix類玩。在這裏你可以得到翻譯和使用它,你可以得到旋轉角度。 here是一個教程。

執行轉換後,例如圍繞任意點的位圖旋轉,縮放會丟失。當然,這是有道理的,因爲位圖是在相同的邊界內旋轉的。

爲了獲得真實的比例,以及最可靠的旋轉度,我不得不採用這種方法。希望它能在一兩個晚上節省你剩下的時間。

你可以得到角度如下: -

float[] v = new float[9]; 
matrix.getValues(v); 
// translation is simple 
float tx = v[Matrix.MTRANS_X]; 
float ty = v[Matrix.MTRANS_Y]; 

// calculate real scale 
float scalex = values[Matrix.MSCALE_X]; 
float skewy = values[Matrix.MSKEW_Y]; 
float rScale = (float) Math.sqrt(scalex * scalex + skewy * skewy); 

// calculate the degree of rotation 
float rAngle = Math.round(Math.atan2(v[Matrix.MSKEW_X], v[Matrix.MSCALE_X]) * (180/Math.PI)); 
+0

在哪裏使用rScale @ praveen Sharma – Joy

4

ü要使用RotateGestureDetector項目中的類,如下給出..

public class RotateGestureDetector extends TwoFingerGestureDetector { 

/** 
* Listener which must be implemented which is used by RotateGestureDetector 
* to perform callbacks to any implementing class which is registered to a 
* RotateGestureDetector via the constructor. 
* 
* @see RotateGestureDetector.SimpleOnRotateGestureListener 
*/ 
public interface OnRotateGestureListener { 
    public boolean onRotate(RotateGestureDetector detector); 
    public boolean onRotateBegin(RotateGestureDetector detector); 
    public void onRotateEnd(RotateGestureDetector detector); 
} 

/** 
* Helper class which may be extended and where the methods may be 
* implemented. This way it is not necessary to implement all methods 
* of OnRotateGestureListener. 
*/ 
public static class SimpleOnRotateGestureListener implements OnRotateGestureListener { 
    public boolean onRotate(RotateGestureDetector detector) { 
     return false; 
    } 

    public boolean onRotateBegin(RotateGestureDetector detector) { 
     return true; 
    } 

    public void onRotateEnd(RotateGestureDetector detector) { 
     // Do nothing, overridden implementation may be used 
    } 
} 


private final OnRotateGestureListener mListener; 
private boolean mSloppyGesture; 

public RotateGestureDetector(Context context, OnRotateGestureListener listener) { 
    super(context); 
    mListener = listener; 
} 

@Override 
protected void handleStartProgressEvent(int actionCode, MotionEvent event){ 
    switch (actionCode) { 
     case MotionEvent.ACTION_POINTER_DOWN: 
      // At least the second finger is on screen now 

      resetState(); // In case we missed an UP/CANCEL event 
      mPrevEvent = MotionEvent.obtain(event); 
      mTimeDelta = 0; 

      updateStateByEvent(event); 

      // See if we have a sloppy gesture 
      mSloppyGesture = isSloppyGesture(event); 
      if(!mSloppyGesture){ 
       // No, start gesture now 
       mGestureInProgress = mListener.onRotateBegin(this); 
      } 
      break; 

     case MotionEvent.ACTION_MOVE: 
      if (!mSloppyGesture) { 
       break; 
      } 

      // See if we still have a sloppy gesture 
      mSloppyGesture = isSloppyGesture(event); 
      if(!mSloppyGesture){ 
       // No, start normal gesture now 
       mGestureInProgress = mListener.onRotateBegin(this); 
      } 

      break; 

     case MotionEvent.ACTION_POINTER_UP: 
      if (!mSloppyGesture) { 
       break; 
      } 

      break; 
    } 
} 


@Override 
protected void handleInProgressEvent(int actionCode, MotionEvent event){  
    switch (actionCode) { 
     case MotionEvent.ACTION_POINTER_UP: 
      // Gesture ended but 
      updateStateByEvent(event); 

      if (!mSloppyGesture) { 
       mListener.onRotateEnd(this); 
      } 

      resetState(); 
      break; 

     case MotionEvent.ACTION_CANCEL: 
      if (!mSloppyGesture) { 
       mListener.onRotateEnd(this); 
      } 

      resetState(); 
      break; 

     case MotionEvent.ACTION_MOVE: 
      updateStateByEvent(event); 

      // Only accept the event if our relative pressure is within 
      // a certain limit. This can help filter shaky data as a 
      // finger is lifted. 
      if (mCurrPressure/mPrevPressure > PRESSURE_THRESHOLD) { 
       final boolean updatePrevious = mListener.onRotate(this); 
       if (updatePrevious) { 
        mPrevEvent.recycle(); 
        mPrevEvent = MotionEvent.obtain(event); 
       } 
      } 
      break; 
    } 
} 

@Override 
protected void resetState() { 
    super.resetState(); 
    mSloppyGesture = false; 
} 


/** 
* Return the rotation difference from the previous rotate event to the current 
* event. 
* 
* @return The current rotation //difference in degrees. 
*/ 
public float getRotationDegreesDelta() { 
    double diffRadians = Math.atan2(mPrevFingerDiffY, mPrevFingerDiffX) - Math.atan2(mCurrFingerDiffY, mCurrFingerDiffX); 
    return (float) (diffRadians * 180/Math.PI); 
} 
} 

其易於使用的類和有效旋轉那.. 我希望有用....

+0

在delta變大後發送完全隨機的delta。瘋狂敏感的方式。 –

相關問題