Código de Android para rotar una vista de imagen al tocar o arrastrar evento

Necesito girar una imagen al tocar y arrastrar. Ahora necesito un ángulo del grado cuando la prensa del usuario el imageView y el moove para girar, amablemente me ayudan para el mismo.

 imageView.setRotation(degree); 

Necesito el valor de esta variable del grado en el MotionEvent.ACTION_MOVE block.

2 Solutions collect form web for “Código de Android para rotar una vista de imagen al tocar o arrastrar evento”

U desea utilizar el RotateGestureDetector en su clase de proyecto como se indica a continuación ..

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

Es fácil de usar la clase y eficaz rotar en que .. espero útil ….

Con el fin de mover y ampliar la imagen vamos a utilizar una pequeña función en la clase ImageView llamada transformación de la matriz. Usando una matriz podemos representar cualquier tipo de traducción, rotación o inclinación que queramos hacer a la imagen

 // 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 } 

Y en el gesto

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

Necesitas jugar con la clase Matrix. Aquí usted puede conseguir el traducir y usarlo usted puede conseguir ángulo de la rotación. Aquí hay un tutorial para ello.

Después de realizar transformaciones tales como la rotación de un mapa de bits sobre un punto arbitrario, la escala se pierde. Por supuesto, esto tiene sentido porque el mapa de bits se gira dentro de los mismos límites.

Para obtener la escala real ahora, junto con el grado más fiable de rotación, tuve que seguir este método. Espero que salve el resto de ustedes una noche o dos.

Usted puede conseguir el ángulo como sigue: –

 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)); 
  • Texto de Android sobre la imagen
  • Cómo reemplazar R.drawable. "SomeString"
  • ¿Cómo puedo guardar mi mapa de bits correctamente por segunda vez?
  • ¿Cómo puedo hacer bordes rizados en una vista de imagen en android?
  • Quiero una imagen dentro de SimpleAdapter?
  • Cambio de imagen en ImageView
  • Imagen de escala de Android de setImageBitmap
  • Cómo mantener la relación de aspecto de la imagen si imageview se extiende primero para rellenar padre
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.