Me gustaría establecer un determinado Drawablecomo fondo de pantalla del dispositivo, pero todas las funciones de fondo de pantalla Bitmapsolo aceptan s. No puedo usar WallpaperManagerporque 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
BitmapDrawableantes de lanzarlo:if (d instanceof BitmapDrawable) { Bitmap bitmap = ((BitmapDrawable)d).getBitmap(); }dya es unBitmapDrawable, en cuyo caso es trivial recuperarlo como un mapa de bits ... Se bloquearáClassCastExceptionen todos los demás casos.A
Drawablese puede dibujar sobre aCanvas, y aCanvaspuede ser respaldado porBitmap:(Actualizado para manejar una conversión rápida para
BitmapDrawablesy para garantizar que loBitmapcreado 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
getDrawablemétodo se movió a laResourcesCompatclase, por lo que debe hacer algo como estofuente
android.graphics.drawable.VectorDrawable cannot be cast to android.graphics.drawable.BitmapDrawablemuy simple
fuente
Así que después de mirar (y usar) de las otras respuestas, parece que todo el manejo
ColorDrawabley elPaintDrawablemal. (Especialmente en lollipop) parecía que seShaderhabí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
setBoundsa laDrawableantes de pedir para convertirlo en un mapa de bits, se dibujará el mapa de bits en el tamaño correcto!fuente
Drawableno tiene límites establecidos, usa elIntrinsicWidth/Height. Si ambos son <= 0, establecemos el lienzo en 1px. Estás en lo correcto siDrawableno tiene límites, se pasará un poco (1x1 es la mayoría de los casos), pero esto se REQUIERE para cosas como lasColorDrawableque 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.toBitmapmétodo: https://android.github.io/android-ktx/core-ktx/androidx.graphics.drawable/android.graphics.drawable.-drawable/to-bitmap.htmlDe Kotlin
fuente
VectorDrawableen 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_pica laBitmapDrawabley 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