DonGru
DonGru

Reputation: 13710

Convert String to Drawable

I want to raise a notification showing an icon in the status bar - so far so good, but actually I would like this icon to be a 3 character String.

So my question is: Is there a way to convert my String into a Drawable to display it as Icon in the status bar?

EDIT: I recently found an app which does something similar - Battery Indicator

It shows the current battery level as notification icon in the status bar - I wonder if it really uses different 100 images

Screenshot

Upvotes: 10

Views: 15993

Answers (8)

TheWanderer
TheWanderer

Reputation: 17854

(I know this doesn't answer the OP's question fully, but the title got me here since it's pretty general.)

After fiddling around a bit, I've come up with this solution. It's pretty messy and could probably be improved, but it works.

In its current form, the function takes the first letter of the String it's passed and a unique ID for that String. The ID is only used for background color generation and remembering it, so it can be removed if you're going to use a steady color.

I made this to generate default images for contacts that don't have images saved, but it should be easy to adapt. It also happens to return an InputStream instead of a Drawable, but you can either just return bitmap after drawing to it, or use 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);
}

Upvotes: 0

Jayman Jani
Jayman Jani

Reputation: 1271

try  {

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

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

Upvotes: -1

gmemario
gmemario

Reputation: 1210

I have used a workaround and it worked properly for me.

First i convert the string to bitmap and then convert it to a drawable, here is the code:

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

Hope it helps!

Upvotes: 1

Ashish Dwivedi
Ashish Dwivedi

Reputation: 8196

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

Upvotes: 3

Marmoy
Marmoy

Reputation: 8079

No you can not, I thought you could use the same method as here: Combine image and text to drawable, but you can't, as the notification takes a drawable id, not a drawable object.

Upvotes: 0

Nathan Schwermann
Nathan Schwermann

Reputation: 31503

you can make your own custom drawable that would work just like the textview widget except it is a drawable instead of a view. The textview class is just a container for the drawable that contains the text.

Upvotes: 2

Macarse
Macarse

Reputation: 93173

Short: No, you can't.

Long: The notification needs a R.drawable.something for the icon and you can't create it on runtime.

Upvotes: 3

Sameer Segal
Sameer Segal

Reputation: 22043

Have you looked at the API Demos > App > Notifications > Status Bar?

If you have limited number of String options (like Smileys) you can create drawables for each of those Strings.

Upvotes: 0

Related Questions