原文链接: https://www.jb51.net/article/110808.htm

本文主要介绍了Android 给应用程序的icon添加未读消息个数提示(红圈内数字)的方法。具有很好的参考价值。

最近在做一个可以查看未读消息的功能,需要在界面中的Tab页的标签icon的右上角添加一个未读消息提示的功能。

先上个效果图出来,比较直观明白需求:

思路上似乎有两种

  1. 直接把底图和红圆圈的图片用相对布局进行排列,在代码中动态更改红圆中的TextView的数字,并且识别一下各种情况下红圆的显示或者隐藏。这种方法比较直观。

  2. 采用canvas画出圆和数字。

由于项目采用的是Tab页的形式,其中的RadioButton不适合采用相对布局。故我采用了第二种方式。将绘制的过程写成了工具方法。在需要的时候调用。便于以后的技术迁移。

直接上代码:

/**   * 绘制图标右上角的未读消息数量显示   *   * @param context   *   上下文   * @param icon   *   需要被添加的icon的资源ID   * @param news   *   未读的消息数量   * @return drawable   */@SuppressWarnings("unused")    public static Drawable displayNewsNumber(Context context, int icon, int news) {        //初始化画布        int iconSize = (int) context.getResources().getDimension(                android.R.dimen.app_icon_size);        Bitmap iconBitmap = BitmapFactory.decodeResource(                context.getResources(), icon).copy(Bitmap.Config.ARGB_8888, true);        // Bitmap contactIcon = Bitmap.createBitmap(iconSize, iconSize,        // Config.ARGB_8888);        Canvas canvas = new Canvas(iconBitmap);        //拷贝图片        Paint iconPaint = new Paint();        iconPaint.setDither(true);// 防抖动        iconPaint.setFilterBitmap(true);//用来对Bitmap进行滤波处理         Rect src = new Rect(0, 0, iconBitmap.getWidth(), iconBitmap.getHeight());        Rect dst = new Rect(0, 0, iconBitmap.getWidth(), iconBitmap.getHeight());        canvas.drawBitmap(iconBitmap, src, dst, iconPaint);        //启用抗锯齿和使用设备的文本字距        Paint countPaint = new Paint(Paint.ANTI_ALIAS_FLAG                | Paint.DEV_KERN_TEXT_FLAG);        countPaint.setColor(Color.RED);        canvas.drawCircle(iconSize + 25, 20, 15, countPaint);        Paint textPaint = new Paint();        textPaint.setColor(Color.WHITE);        textPaint.setTextSize(19f);        if(news <= 99) {            canvas.drawText(String.valueOf(news), iconSize + 15, 27, textPaint);        } else {            textPaint.setTypeface(Typeface.DEFAULT_BOLD);            textPaint.setTextSize(22f);            canvas.drawText("...", iconSize + 15, 23, textPaint);        }        return new BitmapDrawable(iconBitmap);    }

调用语句:

if (count > 0) {//显示右上角未读消息提示    Drawable mineDrawable = BitmapUtil.displayNewsNumber(this,      R.drawable.icon_mine, count);    mineButton.setCompoundDrawablesWithIntrinsicBounds(null, null,      null, mineDrawable);//这里就是设置背景,自行发挥。   } else {//隐藏    Drawable defaultDrawable = getResources().getDrawable(      R.drawable.icon_mine);    mineButton.setCompoundDrawablesWithIntrinsicBounds(null, null,      null, defaultDrawable);   }

注:
1.count是未读消息的数量。

2.setCompoundDrawablesWithIntrinsicBounds(Drawable left, Drawable top, Drawable right, Drawable bottom)可以在上、下、左、右设置图标,如果不想在某个地方显示,则设置为null。图标的宽高将会设置为固有宽高,既自动通过getIntrinsicWidth和getIntrinsicHeight获取。该方法是和在xml中设置 Android:drawableTop="@drawable/icon_mine"的效果一样。

更多相关文章

  1. Android(安卓)O预览版有哪些缺点?Android(安卓)O预览版火速刷机
  2. 图文浅析之Android显示原理
  3. 利用Android游戏引擎Angle开发界面——显示汉字
  4. 仿Android联系人SideBar排序,根据拼音A-Z字母快速导航联系人姓名,
  5. 源码的完全解析:Android的消息机制
  6. 一个android应用效果开发引发的惨案(android Home按键)
  7. Android信息推送技术简要分析
  8. android 软键盘Enter键图标的设置 android:imeOptions
  9. android线程 Handler Message Queue AsyncTask线程模型 线程交互

随机推荐

  1. Linux adb运行时提示:No such file or dir
  2. 开启GPS
  3. android 判断真机还是虚拟机的方法汇总
  4. assets点9图加载成NinePatchDrawable
  5. Toast 使用方法
  6. ImageLoader修改后
  7. android&&DatePicker&&TimePicker
  8. 图片加载缓存类的具体实现
  9. MT6735修改听筒增益
  10. Android相对布局实例