Imagen Redimensionar, Girar, Mover poniendo algún indicador alrededor de la imagen

Me gustaría escalar, mover, cambiar el tamaño de la imagen. Quisiera rodear la imagen con los indicadores que guían al usuario qué operación estos indicadores realizan es decir moviendo, girando, escalando.

Introduzca aquí la descripción de la imagen

He intentado

  • Escalado, pero sólo se reduce. No hay posibilidad de aumentar la longitud y la altura de la imagen.
  • Girar – Alcanzado pero mediante la inserción de grados manuales. Eso no es una buena opción aquí.
  • Moving – Como estoy logrando arrastrar en Api <11. Así que poco de difícil. Todavía no hay esperanza aquí.

¿Hay alguna biblioteca que me puede hacer simple imagen editar [Mover, Escala, Girar] ??

¡¡Cualquier ayuda sería apreciada!!

Usted puede utilizar la transaformación de Matrix para lograr girar, escalar y mover …. Espero que esto le ayudará ….

Para girar

 Matrix matrix = new Matrix(); matrix.postRotate(90); 

Para escalar

  matrix.postScale(scaleWidth, scaleHeight); 

Crear nuevo mapa de bits sin cambiar el original … como este

 Bitmap bmp2 = Bitmap.createBitmap(bmp1, 0, 0, pow2, pow2, matrix, true); 

Sólo echa un vistazo a esta imagen de referencia de cultivo:

http://www.londatiga.net/featured-articles/how-to-select-and-crop-image-on-android/

Espero que esto ayude u …..

Rotacion de imagen :

Sólo se refieren a este ejemplo .. este código de ejemplo representa la rotación de la imagen de forma dinámica ….

http://android-er.blogspot.in/2010/07/rotate-bitmap-image-using-matrix.html

Este enlace también es útil para recortar imágenes, rotar y escalar

https://github.com/Yalantis/uCrop

Recientemente he intentado lo mismo, pero terminó usando una biblioteca ya que cubría mucho más casos de borde. Esta es una biblioteca genial y bastante utilizada:

http://code.google.com/p/android-multitouch-controller/

Uso de la biblioteca: StickerView

Es una biblioteca de terceros que da exactamente lo que estaba buscando.

WorkAround:

Sin embargo, estas respuestas son la mitad de lo que he pedido en OP. Significa que no está rodeado por algún indicador específico. Todavía estoy buscando cómo insertar ImageView con indicadores y utilizarlos para Traducir y cambiar el tamaño.

Initilización de variables dentro de la Activity importante para traducir y redimensionar ImageView

 public static final int DRAG = 1; public static final int NONE = 0; private static final String TAG = "Touch"; public static final int ZOOM = 2; public static PointF mid = new PointF(); public static int mode = 0; float d = 0.0F; Matrix savedMatrix = new Matrix(); Matrix matrix = new Matrix(); PointF start = new PointF(); 

Configuración de ImageView a scaleType – Matrix

 iv = new ImageView(this); iv.setPadding(10, 10, 25, 25); iv.setScaleType(ImageView.ScaleType.MATRIX); iv.setOnTouchListener(t); 

Añadir OnTouch Listener a ImageView que utiliza

  • 1 dedo para traducir – arrastrar
  • 2 Dedos para Zoom – Redimensionar {Pinch To Zoom}

     View.OnTouchListener t = new View.OnTouchListener() { public boolean onTouch(View paramView, MotionEvent event) { ImageView view = (ImageView)paramView; 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_POINTER_DOWN: oldDist = spacing(event); Log.d(TAG, "oldDist=" + oldDist); if (oldDist > 10f) { savedMatrix.set(matrix); midPoint(mid, event); mode = ZOOM; Log.d(TAG, "mode=ZOOM" ); } 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) { float newDist = spacing(event); Log.d(TAG, "newDist=" + newDist); if (newDist > 10f) { matrix.set(savedMatrix); float scale = newDist / oldDist; matrix.postScale(scale, scale, mid.x, mid.y); } } break; case MotionEvent.ACTION_UP: case MotionEvent.ACTION_POINTER_UP: mode = NONE; Log.d(TAG, "mode=NONE" ); break; } view.setImageMatrix(matrix); return true; } 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(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); } }; 

Creo que puedo ayudarte con la parte de rotación. Hice recientemente una biblioteca del menú de la rueda de androide. Rastrea el movimiento de la mano del usuario y rota la imagen en consecuencia. Puedes consultar la fuente para ver cómo lo hice aquí:

https://github.com/anupcowkur/Android-Wheel-Menu

Sé que esto no es una respuesta, pero vale la pena mencionar (no se puede hacer en los comentarios).

Echa un vistazo a este proyecto . Tengo la intención de ponerlo en github pero no se ha hecho todavía (en absoluto).

Hay un botón para girar la imagen. Todavía estoy trabajando en el "salvar". Muchas de las clases son tomadas de la fuente androide gracias al proyecto de Lorenzo Villani

Añadir al manifiesto de su proyecto

  <activity android:name="mobi.sherif.camera.CropImage" android:hardwareAccelerated="false" android:screenOrientation="portrait" > 

Llame a la actividad usando:

 Intent intent = new Intent(mContext, CropImage.class); intent.setData(uri); startActivityForResult(intent, S.request.cropimage); 

Introduzca aquí la descripción de la imagen

Rotación de mapa de bits

 Bitmap targetBitmap = Bitmap.createBitmap(targetWidth, targetHeight, config); Canvas canvas = new Canvas(targetBitmap); Matrix matrix = new Matrix(); matrix.setRotate(mRotation,source.getWidth()/2,source.getHeight()/2); canvas.drawBitmap(source, matrix, new Paint()); 

Escalado de escala de imagen

 AssetManager assetManager = context.getAssets(); InputStream imageIn; String imgPath = "test.png"; Bitmap image; try { imageIn = assetManager.open(imgPath, AssetManager.ACCESS_BUFFER); image = BitmapFactory.decodeStream(imageIn); } catch (IOException e) { } //TODO: calculate width and height to fill or fit screen image = Bitmap.createScaledBitmap(image, width, height, true); 

Imagen en movimiento Imagen en lienzo con eventos táctiles

 import android.content.Context; import android.graphics.Canvas; import android.graphics.drawable.BitmapDrawable; import android.util.AttributeSet; import android.util.Log; import android.view.MotionEvent; import android.view.ScaleGestureDetector; import android.view.View; public class ImgView extends View { private static final int INVALID_POINTER_ID = -1; private Drawable mImage; private float mPosX; private float mPosY; private float mLastTouchX; private float mLastTouchY; private int mActivePointerId = INVALID_POINTER_ID; private ScaleGestureDetector mScaleDetector; private float mScaleFactor = 1.f; public ImgView(Context context) { this(context, null, 0); mImage = getResources().getDrawable(R.drawable.imagename); mImage.setBounds(0, 0, mImage.getIntrinsicWidth(), mImage.getIntrinsicHeight()); } public ImgView(Context context, AttributeSet attrs) { this(context, attrs, 0); } public ImgView(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); mScaleDetector = new ScaleGestureDetector(context, new ScaleListener()); } @Override public boolean onTouchEvent(MotionEvent ev) { // Let the ScaleGestureDetector inspect all events. mScaleDetector.onTouchEvent(ev); final int action = ev.getAction(); switch (action & MotionEvent.ACTION_MASK) { case MotionEvent.ACTION_DOWN: { final float x = ev.getX(); final float y = ev.getY(); mLastTouchX = x; mLastTouchY = y; mActivePointerId = ev.getPointerId(0); break; } case MotionEvent.ACTION_MOVE: { final int pointerIndex = ev.findPointerIndex(mActivePointerId); final float x = ev.getX(pointerIndex); final float y = ev.getY(pointerIndex); // Only move if the ScaleGestureDetector isn't processing a gesture. if (!mScaleDetector.isInProgress()) { final float dx = x - mLastTouchX; final float dy = y - mLastTouchY; mPosX += dx; mPosY += dy; invalidate(); } mLastTouchX = x; mLastTouchY = y; break; } case MotionEvent.ACTION_UP: { mActivePointerId = INVALID_POINTER_ID; break; } case MotionEvent.ACTION_CANCEL: { mActivePointerId = INVALID_POINTER_ID; break; } case MotionEvent.ACTION_POINTER_UP: { final int pointerIndex = (ev.getAction() & MotionEvent.ACTION_POINTER_INDEX_MASK) >> MotionEvent.ACTION_POINTER_INDEX_SHIFT; final int pointerId = ev.getPointerId(pointerIndex); if (pointerId == mActivePointerId) { // This was our active pointer going up. Choose a new // active pointer and adjust accordingly. final int newPointerIndex = pointerIndex == 0 ? 1 : 0; mLastTouchX = ev.getX(newPointerIndex); mLastTouchY = ev.getY(newPointerIndex); mActivePointerId = ev.getPointerId(newPointerIndex); } break; } } return true; } @Override public void onDraw(Canvas canvas) { super.onDraw(canvas); canvas.save(); Log.d("DEBUG", "X: "+mPosX+" Y: "+mPosY); canvas.translate(mPosX, mPosY); canvas.scale(mScaleFactor, mScaleFactor); mImage.draw(canvas); canvas.restore(); } private class ScaleListener extends ScaleGestureDetector.SimpleOnScaleGestureListener { @Override public boolean onScale(ScaleGestureDetector detector) { mScaleFactor *= detector.getScaleFactor(); // Don't let the object get too small or too large. mScaleFactor = Math.max(0.1f, Math.min(mScaleFactor, 10.0f)); invalidate(); return true; } } } 
FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.