本文属于原创,转载请著名出处:http://flysnow.iteye.com/blog/906770
写道
在我们开发一些如短消息、应用商店等应用时,会考虑在短消息的图标上加上未读短信的数量,在应用商店上加上可以升级的应用数量,这样不占太大空间还能达到提示的目的。

本节就以一个展示手机内联系人数量的例子来演示怎么在一个图标的上面加上数字的例子,也就是一个数字overlay..做过google map开发的知道overlay这个东西。。

一:你可学到

  1. 手机内依据Uri查看联系人
  2. 权限的添加
  3. 获取手机内任意一款应用的应用图标
  4. 对图形的处理,如复制,为图片加上覆盖层--数字。
  5. 使用RemoteView自定义Notification

二:开始行动

  1. 新建名为NotificationIconCount的Android Project。附件中有最终版本的项目工程
  2. 首先修改AndroidManifest.xml,加入权限<uses-permission
    android:name="android.permission.READ_CONTACTS"></uses-permission&
    gt;,因为我们要读取联系人。
  3. 修改main.xml如下,这里定义一个ImageView,勇于预览我们处理好的加上数字的图标。
    1. <?xml version="1.0" encoding="utf-8"?>
    2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    3. android:orientation="vertical"
    4. android:layout_width="fill_parent"
    5. android:layout_height="fill_parent"
    6. >
    7. <ImageView
    8. android:id="@+id/icon"
    9. android:layout_width="wrap_content"
    10. android:layout_height="wrap_content"
    11. android:scaleType="center"
    12. android:adjustViewBounds="true"/>
    13. </LinearLayout>
  4. 先来获取手机内通讯录的图标,如果没有获取到,则使用该应用的图标.
    1. super.onCreate(savedInstanceState);
    2. setContentView(R.layout.main);
    3. mImageView=(ImageView)findViewById(R.id.icon);
    4. //优先采用联系人的图标,如果不存在则采用该应用的图标
    5. Drawable contactIcon;
    6. try {
    7. contactIcon = getPackageManager().getApplicationIcon("com.android.contacts");
    8. } catch (NameNotFoundException e) {
    9. contactIcon=null;
    10. }
    11. Bitmap icon;
    12. if(contactIcon instanceof BitmapDrawable){
    13. icon=((BitmapDrawable)contactIcon).getBitmap();
    14. }else{
    15. icon=getResIcon(getResources(), R.id.icon);
    16. }

    这里用到一个自定义的根据资源图标id获取图片的函数,很简单,代码如下:

    1. /**
    2. * 根据id获取一个图片
    3. * @param res
    4. * @param resId
    5. * @return
    6. */
    7. private Bitmap getResIcon(Resources res,int resId){
    8. Drawable icon=res.getDrawable(resId);
    9. if(icon instanceof BitmapDrawable){
    10. BitmapDrawable bd=(BitmapDrawable)icon;
    11. return bd.getBitmap();
    12. }else{
    13. return null;
    14. }
    15. }
  5. 获取到图标之后就要对这个图标进行处理了,要为该图标加上联系人数量的覆盖,首先我们看获取联系人个数的函数。
    1. /**
    2. * 获取联系人的个数
    3. * @return 手里通讯录中联系人的个数
    4. */
    5. private int getContactCount(){
    6. Cursor c=getContentResolver().query(ContactsContract.Contacts.CONTENT_URI, new String[]{ContactsContract.Contacts._COUNT}, null, null, null);
    7. try{
    8. c.moveToFirst();
    9. return c.getInt(0);
    10. }catch(Exception e){
    11. return 0;
    12. }finally{
    13. c.close();
    14. }
    15. }

    这里采用Uri的方式获取联系人的cursor,然后获取个数。

  6. 有了图标和联系人个数就可以生成带联系人个数的图标了,我们看下生成的这个函数。
    1. /**
    2. * 在给定的图片的右上角加上联系人数量。数量用红色表示
    3. * @param icon 给定的图片
    4. * @return 带联系人数量的图片
    5. */
    6. private Bitmap generatorContactCountIcon(Bitmap icon){
    7. //初始化画布
    8. int iconSize=(int)getResources().getDimension(android.R.dimen.app_icon_size);
    9. Log.d(TAG, "the icon size is "+iconSize);
    10. Bitmap contactIcon=Bitmap.createBitmap(iconSize, iconSize, Config.ARGB_8888);
    11. Canvas canvas=new Canvas(contactIcon);
    12. //拷贝图片
    13. Paint iconPaint=new Paint();
    14. iconPaint.setDither(true);//防抖动
    15. iconPaint.setFilterBitmap(true);//用来对Bitmap进行滤波处理,这样,当你选择Drawable时,会有抗锯齿的效果
    16. Rect src=new Rect(0, 0, icon.getWidth(), icon.getHeight());
    17. Rect dst=new Rect(0, 0, iconSize, iconSize);
    18. canvas.drawBitmap(icon, src, dst, iconPaint);
    19. //在图片上创建一个覆盖的联系人个数
    20. int contacyCount=getContactCount();
    21. //启用抗锯齿和使用设备的文本字距
    22. Paint countPaint=new Paint(Paint.ANTI_ALIAS_FLAG|Paint.DEV_KERN_TEXT_FLAG);
    23. countPaint.setColor(Color.RED);
    24. countPaint.setTextSize(20f);
    25. countPaint.setTypeface(Typeface.DEFAULT_BOLD);
    26. canvas.drawText(String.valueOf(contacyCount), iconSize-18, 25, countPaint);
    27. return contactIcon;
    28. }

    注释的很详细,就不解释了,无非就是定义一个画布(Canvas),然后在上面画图标,画数字文本。

  7. 然后我们把得到的这个处理过的Bitmap放在我们在main.xml里定义的ImageView里展示就可以看到效果了.
    1. mImageView.setImageBitmap(contactCountIcon);
  8. 我们启动应用看看效果.

     我们看到了,右上角红色的1代表我手机中有一个联系人

三:采用状态栏通知的办法展示联系人的数量

  1. 如果我们监听未读短信的数量,展示在状态栏通知了,就可以用这个方法,我这里还是以联系人的数量为例
  2. 由于Notification默认的icon字段使用的是一个一个资源的引用类型int,所以我们这里采用RemoteView的方式自定义
    Notification。定义RemoteView,需要一个layout,用于定义展示的Notification样式,我们新建一个
    notification.xml布局文件如下:

    1. <?xml version="1.0" encoding="utf-8"?>
    2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    3. android:orientation="horizontal"
    4. android:layout_width="fill_parent"
    5. android:layout_height="fill_parent"
    6. android:padding="3dp"
    7. >
    8. <ImageView android:id="@+id/image"
    9. android:layout_width="wrap_content"
    10. android:layout_height="fill_parent"
    11. android:layout_marginRight="10dp"
    12. />
    13. <TextView android:id="@+id/text"
    14. android:layout_width="wrap_content"
    15. android:layout_height="fill_parent"
    16. android:textColor="#000"
    17. />
    18. </LinearLayout>

    很简单,一个ImageView和一个TextView,用于显示提示的图标和文字。

  3. 要想使用Notification,我们必须获取一个Service--NotificationManager,Android中由它来管理我们的Notification,获取NotificationManager的代码如下,卸载onCreate方法里
    1. nm=(NotificationManager)getSystemService(Context.NOTIFICATION_SERVICE);
  4. 然后紧接着我们就调用我们定义好的方法来显示通知:
    1. showNotifacation(contactCountIcon);
  5. 下面我们看一下方法showNotifacation的具体实现:
    1. /**
    2. * 显示状态栏通知
    3. * @param icon 通知内容图标
    4. */
    5. private void showNotifacation(Bitmap icon){
    6. Notification notification=new  Notification(R.drawable.icon,"联系人数量",System.currentTimeMillis());
    7. //使用RemoteView自定义通知视图
    8. RemoteViews contentView=new RemoteViews(getPackageName(), R.layout.notification);
    9. contentView.setImageViewBitmap(R.id.image, icon);
    10. contentView.setTextViewText(R.id.text, "图标上的红色数字表示手机中联系人的数量");
    11. notification.contentView=contentView;
    12. Intent notificationIntent=new Intent(this, NotificationIconActivity.class);
    13. PendingIntent contentIntent=PendingIntent.getActivity(this, 0, notificationIntent, 0);
    14. notification.contentIntent=contentIntent;
    15. nm.notify(NOTIFICATION_CONTACT_ID, notification);
    16. }

    注释的都很详细,就不一一解释了

  6. 最后的就是重写onDestroy,在Android销毁该Activity的时候清除我们的通知。
    1. @Override
    2. protected void onDestroy() {
    3. super.onDestroy();
    4. nm.cancel(NOTIFICATION_CONTACT_ID);
    5. }
  7. 运行,可以看到如下效果

     可以看到,效果已经出来了。。

四:小结和一点引申

这结的主要关键还是对图片的处理,比如这里的加上数字,当时你也可以加上其他的东西,Canvas里有很多相应的函数可以使用。。

这里说的都是应用内、状态通知等一些显示处理后图片的办法,那么有没有方法处理手机主屏
幕上的图标的办法,为他们加上数字呢。比如在短信息的应用图标的右上角加上未读短信数目等,答案是有的,不过是迂回实现的,给个思路就是使用
AppWidget,这个可以实现,还能动态更新,具体怎么实现,大家可以自己摸索下,这里只提供个思路,整体和这节的例子差不多,只不过呢,要做成
AppWidget。。。

Android中为图标加上数字--用于未读短信数提醒,待更新应用数提醒等的更多相关文章

  1. Android中为图标加上数字

    Android中为图标加上数字--用于未读短信数提醒,待更新应用数提醒等 http://flysnow.iteye.com/blog/906770

  2. Android 类似未读短信图标显示数字效果的分析

    之前一直以为是应用本身在对图标进行修改,看了源码之后发现其实主要的工作并不是应用自己完成的,主要的工作在是launcher里面完成的. 关于系统里面类似未读短信的具体处理流程如下, 原理 一个应用要实 ...

  3. Android开发之Intent跳转到系统应用中的拨号界面、联系人界面、短信界面

    现在开发中的功能需要直接跳转到拨号.联系人.短信界面等等,查找了很多资料,自己整理了一下. 1.跳转到拨号界面,代码如下: 1)直接拨打 Intent intentPhone = new Intent ...

  4. Android中GridView通过自定义适配器(未优化)实现图文视图排列

    Android中GridView组件用来以网格方式排列视图,与矩阵类似,当屏幕上有很多元素(文字.图片或其他元素)需要显示时,可以使用该组件.下面我们通过代码实现如下图例(为了方便截图,将事件处理(土 ...

  5. Android开发中使用Intent跳转到系统应用中的拨号界面、联系人界面、短信界面

    现在开发中的功能需要直接跳转到拨号.联系人.短信界面等等,查找了很多资料,自己整理了一下. 首先,我们先看拨号界面,代码如下: Intent intent =new Intent(); intent. ...

  6. Android 打开URL中的网页和拨打电话、发送短信功能

    拨打电话需要的权限 <uses-permission android:name="android.permission.CALL_PHONE"/> 为了省事界面都写一起 ...

  7. iPhone 和Android应用,特殊的链接:打电话,短信,email;

    http://ice-k.iteye.com/blog/1426526 下面的这篇文章主要是说,网页中的链接如何写,可以激活电话的功能. 例如,页面中展示的是一个电话号码,当用户在手机浏览器里面点击这 ...

  8. [置顶] android开发之来电自动拒接并自动回复短信_上课模式app

    上课的时候老师说总是错过电话,对方打来没人接还一遍遍的打,觉得可以有个app在上课期间自动拒接电话,并自动回复短信过去. 当然了,需要权限的. 尝试做了个雏形出来. 界面如下: 主要代码如下: pac ...

  9. iPhone 和Android应用,特殊的链接:打电话,短信,email

    下面的这篇文章主要是说,网页中的链接如何写,可以激活电话的功能. 例如,页面中展示的是一个电话号码,当用户在手机浏览器里面点击这个电话号码的时候,手机会弹出拨号的面板,或者是短信程序会启动等. 1. ...

随机推荐

  1. CSAPP LAB: Buffer Overflow

    这是CSAPP官网上的著名实验,通过注入汇编代码实现堆栈溢出攻击.实验材料可到我的github仓库 https://github.com/Cheukyin/CSAPP-LAB/ 选择buffer-ov ...

  2. Ubuntu phpmyadmin 缺少mcrypt扩展解决方法

    之前在登陆phpmyadmin的时候,会出现警告说缺少mcrypt扩展的错误,一直没去解决这个问题,觉得没什么影响就算了. 今天谷歌了一下,原来是php5没有启用mcrypt模块.   sudo ph ...

  3. bzoj3583: 杰杰的女性朋友 && 4362: Graph

    Description 给出一张n个点的有向图G(V,E).对于任意两个点u,v(u可以等于v),u向v的连边数为: ∑OUT(u,i) * IN(v,i),其中1<=i<=K 其中k和数 ...

  4. iscc2016-basic-明察秋毫

    查看源代码,找到maybe not flag : Jr1p0zr2VfPp 移位密码,注意判断字母大小写,并且数字无变化 s = "Jr1p0zr2VfPp" p = list(s ...

  5. IOS中用模型取代字典的好处

    使用字典的坏处 一般情况下,设置数据和取出数据都是用“字符串类型的key”,编写这些key时,编译器不会有任何友情提示,需要手敲 dict[@“name”]=@“Kevin”; NSString *n ...

  6. 使用 HT 单片机芯片做触摸按键的试验:触摸按键实践一

    使用 HT 芯片做触摸按键,可供使用的专门用途芯片主要有:HT45R35,HT45R36,HT45R38,原来还有一个 45R34 ,不知道为何停止生产了.如果仅仅是为了按键功能,选择 45R35 觉 ...

  7. 获得进程可执行文件的路径: GetModuleFileNameEx, GetProcessImageFileName, QueryFullProcessImageName

    http://blog.csdn.net/bichenggui/article/details/4774457 -------------------------------------------- ...

  8. 对于唯一索引使用唯一条件搜索, InnoDB 只锁定找到的index record,不是它之前的区间

    | test100 | CREATE TABLE `test100` ( `sn` int(11) NOT NULL AUTO_INCREMENT COMMENT '自增编号', `phoneNo` ...

  9. texedo 分布式事务

    1.问题现象 但是实际情况,完全出乎笔者的想法.检查一般对象数据表锁定,只需要检查v$locked_object和v$transaction视图,就可以定位到具体人.但是检查之后的结果如下: SQL& ...

  10. 【POJ】1204 Word Puzzles

    这道题目各种wa.首先是错了一个坐标,居然没测出来.然后是剪枝错误.搜索pen时就返回,可能还存在串pen*. #include <cstdio> #include <cstring ...