Me gustaría establecer un determinado Drawable
como fondo de pantalla del dispositivo, pero todas las funciones de fondo de pantalla Bitmap
solo aceptan s. No puedo usar WallpaperManager
porque soy pre 2.1.
Además, mis dibujos se descargan de la web y no residen en ellos R.drawable
.
Respuestas:
Este fragmento de código ayuda.
Aquí una versión donde se descarga la imagen.
fuente
fuente
getIntrinsicWidth()
ygetIntrinsicHieght()
devolverá -1 si dibujable es un color sólido.Esto convierte un BitmapDrawable en un Bitmap.
fuente
BitmapDrawable
antes de lanzarlo:if (d instanceof BitmapDrawable) { Bitmap bitmap = ((BitmapDrawable)d).getBitmap(); }
d
ya es unBitmapDrawable
, en cuyo caso es trivial recuperarlo como un mapa de bits ... Se bloquearáClassCastException
en todos los demás casos.A
Drawable
se puede dibujar sobre aCanvas
, y aCanvas
puede ser respaldado porBitmap
:(Actualizado para manejar una conversión rápida para
BitmapDrawable
sy para garantizar que loBitmap
creado tenga un tamaño válido)fuente
MÉTODO 1 : puede convertir directamente a mapa de bits como este
MÉTODO 2 : Incluso puede convertir el recurso en dibujable y de eso puede obtener un mapa de bits como este
Para API> 22, el
getDrawable
método se movió a laResourcesCompat
clase, por lo que debe hacer algo como estofuente
android.graphics.drawable.VectorDrawable cannot be cast to android.graphics.drawable.BitmapDrawable
muy simple
fuente
Así que después de mirar (y usar) de las otras respuestas, parece que todo el manejo
ColorDrawable
y elPaintDrawable
mal. (Especialmente en lollipop) parecía que seShader
habían ajustado los s para que los bloques sólidos de colores no se manejaran correctamente.Estoy usando el siguiente código ahora:
A diferencia de los demás, si se llama
setBounds
a laDrawable
antes de pedir para convertirlo en un mapa de bits, se dibujará el mapa de bits en el tamaño correcto!fuente
Drawable
no tiene límites establecidos, usa elIntrinsicWidth/Height
. Si ambos son <= 0, establecemos el lienzo en 1px. Estás en lo correcto siDrawable
no tiene límites, se pasará un poco (1x1 es la mayoría de los casos), pero esto se REQUIERE para cosas como lasColorDrawable
que NO tienen tamaños intrínsecos. Si no hiciéramos esto, arrojaría unException
, no puedes dibujar 0x0 en un lienzo.mutate()
haría una copia dejando solo el dibujo original, lo que negaría el problema de pasar de nuevo a los límites originales. Raramente cambio el código basado en esos puntos. Si su caso de uso lo requiere, agregue otra respuesta. Le sugiero que cree otra pregunta para la escala de mapa de bits.Quizás esto ayude a alguien ...
Desde PictureDrawable a Bitmap, use:
... implementado como tal:
fuente
Drawable
, en este caso, aPictureDrawable
.Aquí hay una mejor resolución
Código de Cómo leer bits dibujables como InputStream
fuente
1) dibujable a Bitmap:
2) mapa de bits a Drawable:
fuente
Aquí está la buena versión de Kotlin de la respuesta proporcionada por @ Chris.Jenkins aquí: https://stackoverflow.com/a/27543712/1016462
fuente
android-ktx tiene
Drawable.toBitmap
método: https://android.github.io/android-ktx/core-ktx/androidx.graphics.drawable/android.graphics.drawable.-drawable/to-bitmap.htmlDe Kotlin
fuente
VectorDrawable
en Kotlin! También compartido en esta publicación SO aquí con más detalle.Android proporciona una solución foward no lineal:
BitmapDrawable
. Para obtener el mapa de bits, tendremos que proporcionar la identificación del recursoR.drawable.flower_pic
a laBitmapDrawable
y luego convertirla en aBitmap
.fuente
Use este código. Le ayudará a lograr su objetivo.
fuente
BitmapFactory.decodeResource()
escala automáticamente el mapa de bits, por lo que su mapa de bits puede aparecer borroso. Para evitar el escalado, haga esto:o
fuente
si está usando kotlin, use el siguiente código. funcionará
// para usar la ruta de la imagen
fuente
La última biblioteca principal de androidx (androidx.core: core-ktx: 1.2.0) ahora tiene una función de extensión:
Drawable.toBitmap(...)
para convertir un Drawable en un mapa de bits.fuente
fuente
ImageWorker Library puede convertir mapas de bits a dibujables o base64 y viceversa.
Implementación
En Project Level Gradle
En el nivel de aplicación Gradle
También puede almacenar y recuperar imágenes de mapas de bits / dibujables / base64 desde el exterior.
Chequea aquí. https://github.com/1AboveAll/ImageWorker/edit/master/README.md
fuente