(so che questo non risponde pienamente alla domanda del PO, ma il titolo mi ha fatto qui in quanto è abbastanza generale.)
Dopo armeggiare un po 'intorno, mi è venuta in mente questa soluzione . È piuttosto disordinato e potrebbe probabilmente essere migliorato, ma funziona.
Nella sua forma attuale, la funzione prende la prima lettera della Stringa passata e un ID univoco per quella Stringa. L'ID viene utilizzato solo per la generazione del colore di sfondo e per ricordarlo, quindi può essere rimosso se si utilizzerà un colore fisso.
Ho fatto questo per generare immagini predefinite per i contatti che non hanno immagini salvate, ma dovrebbe essere facile da adattare. Capita anche di restituire un InputStream invece di un Drawable, ma puoi semplicemente restituire bitmap
dopo averlo disegnato, oppure usare 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);
}
solo nel caso in cui qualcuno è interessato: ho capito che la domanda di cui sopra usa in realtà una sola immagine per valore – DonGru
Questo è esattamente quello che mi serve.Hai trovato una soluzione, oltre a creare 100 png (per ogni valore dpi) con lo stato della batteria? – vault