Tamaño de pantalla de Android Scaling Canvas
Tengo una aplicación de dibujo que permite al usuario dibujar a un lienzo en blanco. Estoy tratando de dibujar una "miniatura" escalada del mapa de bits actual para que cuando el usuario ha escalado en la vista, pueden hacer referencia a la miniatura para tener una idea de dónde están en el lienzo de dibujo general. Tengo la escala funcionando, y estoy mostrando la miniatura en la ubicación correcta, pero parece que la miniatura no se está actualizando en onDraws posteriores cuando nuevas líneas / formas se agregan.
Así que tengo acceso al mapa de bits subyacente para esta vista (para mostrar la miniatura, ser capaz de guardar fácilmente el mapa de bits a un archivo, etc) hago lo siguiente en onSizeChanged () para la vista:
- Obtener mapa de bits de ImageView en Android L
- Dando dibujo / Pintura / Ahorro de múltiples mapas de bits
- ¿Cómo puedo guardar un mapa de bits con onRetainNonConfigurationInstance () para la orientación de la pantalla?
- ¿Cómo dibujo texto en negrita en un mapa de bits?
- Asegúrese de que el área del mapa de bits sea transparente al tocar -> de nuevo
@Override protected void onSizeChanged(int w, int h, int oldw, int oldh) { super.onSizeChanged(w, h, oldw, oldh); // set the canvas height, panning, etc, based on the now inflated View mWidth = getWidth(); mHeight = getHeight(); mAspectRatio = mWidth / mHeight; mPanX = 0; mPanY = 0; // create the Bitmap, set it to the canvas mBitmap = Bitmap.createBitmap(mWidth, mHeight, Bitmap.Config.ARGB_8888); mCanvas.setBitmap(mBitmap); draw(mCanvas); }
Entonces, cuando el usuario dibuja y invalidate () es llamado, hago lo siguiente en onDraw () para generar la miniatura:
@Override protected void onDraw(Canvas canvas) { <snipped code that draws paths, shapes to canvas> if (mScaled) { Bitmap out = Bitmap.createScaledBitmap(mBitmap, (int) thumbWidth, (int) thumbHeight, false); canvas.drawBitmap(out, null, thumbnailRectF, thumbCanvasPaint); } }
La miniatura se muestra en el espacio definido por thumbnailRectF utilizando el thumbCanvasPaint, pero en las siguientes llamadas onDraw (), el mapa de bits escalado no ha cambiado de su estado original, aunque el lienzo activo de tamaño completo muestra todos los dibujos, etc. En algunas pruebas, me parece que mientras estoy configurando el mapa de bits con la llamada inicial a dibujar (mCanvas) ;, los onDraws siguientes están escribiendo en el mapa de bits subyacente en lugar de la especificada en onSizeChanged ().
Por lo tanto, supongo que estoy tratando de averiguar cómo atar el lienzo onDraw a un mapa de bits que puedo readliy acceso a realizar re-tamaños, guardar, etc Mirando a esta pregunta , pensé que el sorteo (mCanvas); Call ataría el onDraw al bitmap especificado en el mCanvas (en mi caso, mBitmap), pero en la práctica, no parece estar funcionando, en lo que respecta a las actualizaciones del lienzo.
Gracias,
Pablo
- Conversión de objetos JSON con Bitmaps
- Obtener imagen uri de picasso?
- Android deallocate Bitmaps en la memoria "desconocida"
- Centro de recorte de Android de mapa de bits
- Bitmap to Mat da colores incorrectos de vuelta
- Cómo almacenar (imagen de mapa de bits) y recuperar la imagen de la base de datos sqlite en android?
- DiskLruCache de android tutorial falta muchos métodos.
- Recorte de rectángulo redimensionable de Android
canvas.drawBitmap(out, null, thumbnailRectF, thumbCanvasPaint);
Debe cambiar a
canvas.drawBitmap(out, new Rect(0,0,mBitmap.getWidht, mBitmap.getheight), thumbnailRectF, thumbCanvasPaint);
No hay necesidad de
Bitmap out = Bitmap.createScaledBitmap(mBitmap, (int) thumbWidth, (int)....
Compruebe también que mScaled es true todo el tiempo cuando el zoom es mayor que 1
Escala de mapa de bits por Bitmap.createScaledBitmap
luego dibujar no funcionará
La solución para la escala del mapa de bits de lienzo es utilizar esta función (desde los documentos )
void drawBitmap (Bitmap bitmap, Rect src, Rect dst, Paint paint) // dst : Rect: The rectangle that the bitmap will be scaled/translated to fit into
Por lo que al cambiar el tamaño de dst
, su tamaño de mapa de bits cambiará
Aquí está el ejemplo si quiero dibujar un mapa de bits en la parte superior izquierda y la escala a 100px x 120px
Bitmap bitmap = BitmapFactory.decodeResource(...);//bitmap to be drawn float left = 0; float top = 0; RectF dst = new RectF(left, top, left + 100, top + 120); // width=100, height=120 canvas.drawBitmap(bitmap, null, dst, null);
- Android: Creación de UML desde código fuente Java de Android
- ¿Cómo animar la superposición de una edición de la caja de tabulación en el diseño de Android?