Преобразование String в Drawable

Я хочу поднять уведомление, отображающее значок в строке состояния - настолько хорошо, но на самом деле я хотел бы, чтобы этот значок представлял собой строку с тремя символами.

Итак, мой вопрос: есть ли способ преобразовать мою строку в Drawable, чтобы отобразить ее как значок в строке состояния?

EDIT: Недавно я нашел приложение, которое делает что-то похожее - Индикатор батареи

Показывает текущий уровень заряда аккумулятора в виде значка уведомления в строке состояния - интересно, действительно ли он использует разные 100 изображений

Screenshot

Ответ 1

Короткая: Нет, вы не можете.

Длинно: для значка требуется R.drawable.something для уведомления, и вы не можете его создать во время выполнения.

Ответ 2

   public Drawable getDrawable(String bitmapUrl) {
      try {
        URL url = new URL(bitmapUrl);
        Drawable d =new BitmapDrawable(BitmapFactory.decodeStream(url.openConnection().getInputStream()));
        return d; 
      }
      catch(Exception ex) {return null;}
    }

Ответ 3

вы можете создать свой собственный пользовательский чертеж, который будет работать так же, как и виджет textview, за исключением того, что он предназначен для рисования вместо представления. Класс textview - это просто контейнер для drawable, который содержит текст.

Ответ 4

Я использовал обходной путь, и он работал правильно для меня.

Сначала я преобразую строку в растровое изображение, а затем преобразую ее в drawable, вот код:

byte [] encodeByte=Base64.decode(":",Base64.DEFAULT);
Bitmap bitmap=BitmapFactory.decodeByteArray(encodeByte, 0, encodeByte.length);      
Drawable d = new BitmapDrawable(bitmap);

Надеюсь, что это поможет!

Ответ 5

Вы просмотрели API Demos > App > Уведомления > Строка состояния?

Если у вас ограниченное количество параметров String (например, Smileys), вы можете создавать чертежи для каждой из этих строк.

Ответ 7

(Я знаю, что это не полностью отвечает на вопрос OP, но название получило меня здесь, поскольку оно довольно общее.)

После небольшого поворота я придумал это решение. Это довольно грязно и, вероятно, может быть улучшено, но оно работает.

В его текущей форме функция принимает первую букву переданной строки и уникальный идентификатор для этой строки. Идентификатор используется только для генерации фона и запоминания его, поэтому его можно удалить, если вы собираетесь использовать устойчивый цвет.

Я сделал это для создания изображений по умолчанию для контактов, у которых нет сохраненных изображений, но их легко адаптировать. Также случается возвращать InputStream вместо Drawable, но вы можете либо просто вернуть bitmap после рисования на него, либо использовать 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);
}

Ответ 8

try  {

    InputStream inputStream = new URL(Your imageWebAddress).openStream();

    drawable = Drawable.createFromStream(inputStream, null);
    inputStream.close();
  }
  catch (MalformedURLException ex) { }
  catch (IOException ex) { }
  layout.setBackground(drawable);