Android arrastrar y soltar / rotar mapa de bits en lienzo
Estoy tratando de encontrar una forma de implementar la función de arrastrar y soltar y girar un mapa de bits en mi aplicación de Android. Quiero poder arrastrar una imagen sobre lienzo y rotarla. Aquí es cómo estoy añadiendo bitmap a mi lienzo:
Bitmap bm = BitmapFactory.decodeResource(getResources(), R.drawable.dog); mCanvas.drawBitmap(bm,x-100,y-100 , mPaint);
donde x & y
son iguales a event.getX(); / event.getY();
event.getX(); / event.getY();
.
- Lona de Android a mapa de bits
- Fusionar ImageView con una sola imagen de mapa de bits (Android)
- Android - Rellena el camino parcialmente
- Androide, fondo, lista de capas y elemento de mapa de bits escalable
- Obtener imagen uri de picasso?
¿Alguna idea de cómo puedo lograr esto?
¡Gracias por adelantado! 🙂
- Enmascarar (recortar) la imagen en el marco
- ¿Cómo dibujo texto en negrita en un mapa de bits?
- Cómo crear un mapa de bits cuadrado de un mapa de bits rectangular en Android
- Android, Blur Bitmap al instante?
- Encontrar el color dominante de una imagen en un @drawable de Android
- CORRUPCIÓN DE MEMORIA HEAP EN los errores dlmalloc o dlfree y SIGSEGV en Android ICS 4.0
- Android: lee la imagen PNG sin alpha y decodifica como ARGB_8888
- Cómo averiguar IDs o nombres de sistemas extraíbles (mapas de bits) precargados del volcado de memoria
Aquí está mi solución, tal vez no es muy genial, así que si alguien ha sugerido compartirlo conmigo.
public class BitmapDragAndDrop { BitmapDragAndDropListener listener; public BitmapDragAndDrop(BitmapDragAndDropListener listener) { this.listener = listener; } public boolean onTouch(View view, MotionEvent motionEvent) { switch (motionEvent.getAction()) { case MotionEvent.ACTION_DOWN: listener.onDragStart(motionEvent.getX(), motionEvent.getY()); view.invalidate(); return true; case MotionEvent.ACTION_MOVE: listener.onDragging(motionEvent.getX(), motionEvent.getY()); view.invalidate(); return true; case MotionEvent.ACTION_UP: listener.onDragEnd(listener.onDrop(motionEvent.getX(), motionEvent.getY())); view.invalidate(); return true; } return false; } public interface BitmapDragAndDropListener { void onDragStart(float x, float y); void onDragging(float x, float y); boolean onDrop(float x, float y); void onDragEnd(boolean isEntered); } } public class YourDrawer implements BitmapDragAndDrop.BitmapDragAndDropListener { Bitmap originalImage; //for restore initial state Bitmap drawingImage; //bitmap for drawing states. Canvas imageCanvas; Bitmap objectBitmap; public YourDrawer(Bitmap imageBmp, Bitmap objectBmp) { this.originalImage = imageBmp.copy(Bitmap.Config.RGB_565, true); this.drawingImage = imageBmp.copy(Bitmap.Config.ARGB_8888, true); this.imageCanvas = new Canvas(drawingImage); this.objectBitmap = objectBmp; //Draw your object at standard place where you need drawObject(); } private void restoreImageToOriginal() { imageCanvas.drawBitmap(originalImage, 0, 0, null); } @Override public void onDragStart(float x, float y) { //do whatever you want } @Override public void onDragging(float x, float y) { restoreImageToOriginal(); //Draw bitmap object at new coordinates drawMyObject(x, y); } } @Override public boolean onDrop(float x, float y) { if (isRightPlace(x, y)) { return true; } else { return false; } } @Override public void onDragEnd(boolean isEntered) { restoreImageToOriginal(); if (isEntered) { drawMyObjectAtLastCoordinates(); } } public Bitmap getDrawingBitmap() { return drawingImage; } }
Ofc no es copiar y pegar código. Usted necesita agregar algo de su implementación a él.
En la clase principal (fragmento o actividad) puedes init ese código como este:
YourDrawer yourDrawer = new YourDrawer(originalImage, objectBitmap); onTouchListener = new BitmapDragAndDrop(yourDrawer); imageView.setImageBitmap(yourDrawer.getDrawingBitmap())); imageView.setOnTouchListener(new View.OnTouchListener() { @Override public boolean onTouch(View view, MotionEvent motionEvent) { if (onTouchListener != null) onTouchListener.onTouch(view, motionEvent); return false; } });
Resuelve sólo el problema de arrastrar y soltar, no gira. Pero la idea principal funcionaría incluso para la rotación.
- Unity3d: Actividad de red de fondo y Unity Run Loop
- ¿Cómo puedo añadir mi diseño dinámico a ListView?