(Sé que esto no responde a la pregunta de la OP totalmente, pero el título me tiene aquí, ya que es bastante general.)
Después de juguetear un poco, se me ha ocurrido con esta solución . Es bastante desordenado y probablemente podría mejorarse, pero funciona.
En su forma actual, la función toma la primera letra de la cadena que se pasa y una identificación única para esa cadena. La ID solo se utiliza para la generación de color de fondo y recordarlo, por lo que se puede quitar si va a utilizar un color constante.
He hecho esto para generar imágenes predeterminadas para contactos que no tienen imágenes guardadas, pero debe ser fácil de adaptar. También sucede que devuelve un InputStream en lugar de un Drawable, pero puede simplemente devolver bitmap
después de dibujar en él, o usar Drawable.createFromStream()
.
private static InputStream returnDefaultContact(Context context, String name, long id) {
Paint textPaint = new Paint();
textPaint.setColor(Color.WHITE);
textPaint.setTextAlign(Paint.Align.CENTER);
textPaint.setTextSize(110);
int color = PreferenceManager.getDefaultSharedPreferences(context).getInt("contact_by_id_" + id, 0);
if (color == 0) {
int colorValue1 = (int)((56 + Math.random() * 200));
int colorValue2 = (int)((56 + Math.random() * 200));
int colorValue3 = (int)((56 + Math.random() * 200));
color = Color.rgb(colorValue1, colorValue2, colorValue3);
PreferenceManager.getDefaultSharedPreferences(context).edit().putInt("contact_by_id_" + id, color).apply();
}
Paint backgroundPaint = new Paint();
backgroundPaint.setColor(color);
Bitmap bitmap = Bitmap.createBitmap(120, 120, Bitmap.Config.ARGB_8888);
Canvas canvas = new Canvas(bitmap);
canvas.drawCircle(canvas.getWidth()/2, canvas.getHeight()/2, canvas.getHeight()/2, backgroundPaint);
int xPos = (canvas.getWidth()/2);
int yPos = (int) ((canvas.getHeight()/2) - ((textPaint.descent() + textPaint.ascent())/2)) ;
canvas.drawText(name.substring(0, 1), xPos, yPos, textPaint);
ByteArrayOutputStream stream = new ByteArrayOutputStream();
bitmap.compress(Bitmap.CompressFormat.JPEG, 100, stream);
byte[] imageInByte = stream.toByteArray();
return new ByteArrayInputStream(imageInByte);
}
sólo en caso de que alguien está interesado: Me di cuenta de que la aplicación se ha mencionado anteriormente en realidad utiliza una imagen por valor – DonGru
Esto es exactamente lo que necesito.¿Encontró una solución, además de crear 100 png (por cada valor de ppp) con el estado de la batería? – vault