2014-11-22 99 views
3

我有一個聯繫人列表,我想在每個聯繫人的QuickContactBadge中顯示他的名字的第一個字母。 我可以在運行時創建圖像嗎?Android QuickContactBadge with like like Lollipop

這就好比在運行Android Lollipop,在接觸和使用撥號與QuickContactBadge字母:

Android Lollipop screenshot

+4

https://github.com/amulyakhare/TextDrawable – SunnySydeUp 2014-11-22 23:38:16

回答

6

我用一個函數來生成這些圖像。

public static Bitmap generateCircleBitmap(Context context, int circleColor, float diameterDP, String text){ 
    final int textColor = 0xffffffff; 

    DisplayMetrics metrics = Resources.getSystem().getDisplayMetrics(); 
    float diameterPixels = diameterDP * (metrics.densityDpi/160f); 
    float radiusPixels = diameterPixels/2; 

    // Create the bitmap 
    Bitmap output = Bitmap.createBitmap((int) diameterPixels, (int) diameterPixels, 
      Bitmap.Config.ARGB_8888); 

    // Create the canvas to draw on 
    Canvas canvas = new Canvas(output); 
    canvas.drawARGB(0, 0, 0, 0); 

    // Draw the circle 
    final Paint paintC = new Paint(); 
    paintC.setAntiAlias(true); 
    paintC.setColor(circleColor); 
    canvas.drawCircle(radiusPixels, radiusPixels, radiusPixels, paintC); 

    // Draw the text 
    if (text != null && text.length() > 0) { 
     final Paint paintT = new Paint(); 
     paintT.setColor(textColor); 
     paintT.setAntiAlias(true); 
     paintT.setTextSize(radiusPixels * 2); 
     Typeface typeFace = Typeface.createFromAsset(context.getAssets(),"fonts/Roboto-Thin.ttf"); 
     paintT.setTypeface(typeFace); 
     final Rect textBounds = new Rect(); 
     paintT.getTextBounds(text, 0, text.length(), textBounds); 
     canvas.drawText(text, radiusPixels - textBounds.exactCenterX(), radiusPixels - textBounds.exactCenterY(), paintT); 
    } 

    return output; 
} 

我把聯繫人的名字傳入下面的getMaterialColor函數來選擇一種顏色。

private static List<Integer> materialColors = Arrays.asList(
     0xffe57373, 
     0xfff06292, 
     0xffba68c8, 
     0xff9575cd, 
     0xff7986cb, 
     0xff64b5f6, 
     0xff4fc3f7, 
     0xff4dd0e1, 
     0xff4db6ac, 
     0xff81c784, 
     0xffaed581, 
     0xffff8a65, 
     0xffd4e157, 
     0xffffd54f, 
     0xffffb74d, 
     0xffa1887f, 
     0xff90a4ae 
); 

public static int getMaterialColor(Object key) { 
    return material.get(Math.abs(key.hashCode()) % materialColors.size()); 
} 
+1

很好的回答。幫助了我,謝謝。誰將使用此代碼。請注意「字體/ Roboto-Thin.ttf」。它不適用於API 16及更低版本。所以,你需要手動添加。 – 2017-06-22 18:45:59