2014-11-22 56 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