欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  移动技术

Android 给应用程序的icon添加未读消息个数提示(红圈内数字)

程序员文章站 2022-08-02 15:02:34
最近在做一个可以查看未读消息的功能,需要在界面中的tab页的标签icon的右上角添加一个未读消息提示的功能。 先上个效果图出来,比较直观明白需求: 思路上似乎有两种...

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

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

Android 给应用程序的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 contacticon = bitmap.createbitmap(iconsize, iconsize, 
  // config.argb_8888); 
  bitmap iconbitmap = bitmapfactory.decoderesource( 
    context.getresources(), icon); 
  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 - 13, 20, 10, countpaint); 

  paint textpaint = new paint(); 
  textpaint.setcolor(color.white); 
  // textpaint.settypeface(typeface.default_bold); 
  textpaint.settextsize(19f); 
  canvas.drawtext(string.valueof(news), iconsize - 18, 27, 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"的效果一样。

以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,同时也希望多多支持!