带有 Android Lollipop 等字母的 Android QuickContactBadge

Posted

技术标签:

【中文标题】带有 Android Lollipop 等字母的 Android QuickContactBadge【英文标题】:Android QuickContactBadge with letters like Android Lollipop 【发布时间】:2015-01-20 20:08:00 【问题描述】:

我有一个联系人列表,我想在每个联系人的 QuickContactBadge 中显示他姓名的第一个字母。 我可以在运行时创建图像吗?

这就像 android Lollipop,其中联系人和拨号器使用带有字母的 QuickContactBadge:

【问题讨论】:

github.com/amulyakhare/TextDrawable 【参考方案1】:

我使用一个函数来生成这些图像。

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());

【讨论】:

好答案。帮助了我,谢谢。对于谁将使用此代码。小心“字体/Roboto-Thin.ttf”。它不适用于 API 16 及更低版本。所以,你需要手动添加。

以上是关于带有 Android Lollipop 等字母的 Android QuickContactBadge的主要内容,如果未能解决你的问题,请参考以下文章

如何在带有 Android 5.0 Lollipop 的代码(不是 xml)中以编程方式使用 RippleDrawable?

适用于移动和电视的 Android 通用应用程序 (Lollipop)

Lollipop 在我的应用程序中将按钮的文本大写

使用Material Design在Android Lollipop中的ListView中的活动过渡动画

Android 5.0 Lollipop介绍

Lollipop 上的 Android Button Ripple 和 pre lollipop 上的高亮显示