将String转换为Drawable

时间:2010-08-27 14:13:19

标签: android

我想在状态栏中显示一个显示图标的通知 - 到目前为止一直很好,但实际上我希望这个图标是3个字符的字符串。

所以我的问题是:有没有办法将我的String转换为Drawable以在状态栏中将其显示为Icon?

编辑:我最近发现了一个类似的应用程序 - 电池指示器

它将当前电池电量显示为状态栏中的通知图标 - 我想知道它是否真的使用了不同的100张图像

Screenshot

8 个答案:

答案 0 :(得分:3)

简短:不,你不能。

长:图标通知需要R.drawable.something,您无法在运行时创建。

答案 1 :(得分:3)

   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;}
    }

答案 2 :(得分:2)

你可以创建自己的自定义drawable,就像textview小部件一样,除了它是drawable而不是view。 textview类只是包含文本的drawable的容器。

答案 3 :(得分:1)

我使用了一种解决方法,它适合我。

首先我将字符串转换为位图,然后将其转换为drawable,这是代码:

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

希望它有所帮助!

答案 4 :(得分:0)

您是否看过API演示>应用>通知>状态栏?

如果您有少量的String选项(如Smileys),您可以为每个字符串创建drawable。

答案 5 :(得分:0)

不,你不能,我认为你可以使用与此处相同的方法:Combine image and text to drawable,但你不能,因为通知采用可绘制的id,而不是可绘制的对象。

答案 6 :(得分:0)

(我知道这并没有完全回答OP的问题,但标题让我来到这里,因为它非常普遍。)

在摆弄了一下之后,我已经提出了这个解决方案。它非常混乱,可能会有所改进,但它确实有效。

在当前形式中,该函数接受它传递的String的第一个字母以及该String的唯一ID。该ID仅用于生成背景颜色并记住它,因此如果您要使用稳定的颜色,则可以将其删除。

我这样做是为没有保存图像的联系人生成默认图像,但应该很容易适应。它也恰好返回一个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);
}

答案 7 :(得分:-1)

try  {

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

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