[android]在图标上加提醒的数字

在我们开发一些如短消息、应用商店等应用时,会考虑在短消息的图标上加上未读短信的数量,在应用商店上加上可以升级的应用数量,这样不占太大空间还能达到提示的目的。

本节就以一个展示手机内联系人数量的例子来演示怎么在一个图标的上面加上数字的例子,也就是一个数字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>,因为我们要读取联系人。
  3. 修改main.xml如下,这里定义一个ImageView,勇于预览我们处理好的加上数字的图标。
    Xml代码 复制代码 收藏代码[android]在图标上加提醒的数字
    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>
    <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent" > <ImageView android:id="@+id/icon" android:layout_width="wrap_content" android:layout_height="wrap_content" android:scaleType="center" android:adjustViewBounds="true"/> </LinearLayout>
  4. 先来获取手机内通讯录的图标,如果没有获取到,则使用该应用的图标.
    Java代码 复制代码 收藏代码[android]在图标上加提醒的数字
    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. Bitmap icon; 
    11. if(contactIcon instanceof BitmapDrawable){ 
    12. icon=((BitmapDrawable)contactIcon).getBitmap(); 
    13. }else{ 
    14. icon=getResIcon(getResources(), R.id.icon); 
    15. }
    super.onCreate(savedInstanceState); setContentView(R.layout.main); mImageView=(ImageView)findViewById(R.id.icon); //优先采用联系人的图标,如果不存在则采用该应用的图标 Drawable contactIcon; try { contactIcon = getPackageManager().getApplicationIcon("com.android.contacts"); } catch (NameNotFoundException e) { contactIcon=null; } Bitmap icon; if(contactIcon instanceof BitmapDrawable){ icon=((BitmapDrawable)contactIcon).getBitmap(); }else{ icon=getResIcon(getResources(), R.id.icon); }
    这里用到一个自定义的根据资源图标id获取图片的函数,很简单,代码如下:
    Java代码 复制代码 收藏代码[android]在图标上加提醒的数字
    1. private Bitmap getResIcon(Resources res,int resId){ 
    2. Drawable icon=res.getDrawable(resId); 
    3. if(icon instanceof BitmapDrawable){ 
    4. BitmapDrawable bd=(BitmapDrawable)icon; 
    5. return bd.getBitmap(); 
    6. }else{ 
    7. return null; 
    8. }
     private Bitmap getResIcon(Resources res,int resId){ Drawable icon=res.getDrawable(resId); if(icon instanceof BitmapDrawable){ BitmapDrawable bd=(BitmapDrawable)icon; return bd.getBitmap(); }else{ return null; } }
  5. 获取到图标之后就要对这个图标进行处理了,要为该图标加上联系人数量的覆盖,首先我们看获取联系人个数的函数。
    Java代码 复制代码 收藏代码[android]在图标上加提醒的数字
    1. private int getContactCount(){ 
    2. Cursor c=getContentResolver().query(ContactsContract.Contacts.CONTENT_URI, new String[]{ContactsContract.Contacts._COUNT}, null, null, null); 
    3. try{ 
    4. c.moveToFirst(); 
    5. return c.getInt(0); 
    6. }catch(Exception e){ 
    7. return 0
    8. }finally{ 
    9. c.close(); 
    10. }
     private int getContactCount(){ Cursor c=getContentResolver().query(ContactsContract.Contacts.CONTENT_URI, new String[]{ContactsContract.Contacts._COUNT}, null, null, null); try{ c.moveToFirst(); return c.getInt(0); }catch(Exception e){ return 0; }finally{ c.close(); } }
    这里采用Uri的方式获取联系人的cursor,然后获取个数。
  6. 有了图标和联系人个数就可以生成带联系人个数的图标了,我们看下生成的这个函数。
    Java代码 复制代码 收藏代码[android]在图标上加提醒的数字
    1. private Bitmap generatorContactCountIcon(Bitmap icon){ 
    2. //初始化画布
    3. int iconSize=(int)getResources().getDimension(android.R.dimen.app_icon_size); 
    4. Log.d(TAG, "the icon size is "+iconSize); 
    5. Bitmap contactIcon=Bitmap.createBitmap(iconSize, iconSize, Config.ARGB_8888); 
    6. Canvas canvas=new Canvas(contactIcon); 
    7.  
    8. //拷贝图片
    9. Paint iconPaint=new Paint(); 
    10. iconPaint.setDither(true);//防抖动
    11. iconPaint.setFilterBitmap(true);//用来对Bitmap进行滤波处理,这样,当你选择Drawable时,会有抗锯齿的效果
    12. Rect src=new Rect(0, 0, icon.getWidth(), icon.getHeight()); 
    13. Rect dst=new Rect(0, 0, iconSize, iconSize); 
    14. canvas.drawBitmap(icon, src, dst, iconPaint); 
    15.  
    16. //在图片上创建一个覆盖的联系人个数
    17. int contacyCount=getContactCount(); 
    18. //启用抗锯齿和使用设备的文本字距
    19. Paint countPaint=new Paint(Paint.ANTI_ALIAS_FLAG|Paint.DEV_KERN_TEXT_FLAG); 
    20. countPaint.setColor(Color.RED); 
    21. countPaint.setTextSize(20f); 
    22. countPaint.setTypeface(Typeface.DEFAULT_BOLD); 
    23. canvas.drawText(String.valueOf(contacyCount), iconSize-18, 25, countPaint); 
    24. return contactIcon; 
    25. }
     private Bitmap generatorContactCountIcon(Bitmap icon){ //初始化画布 int iconSize=(int)getResources().getDimension(android.R.dimen.app_icon_size); Log.d(TAG, "the icon size is "+iconSize); Bitmap contactIcon=Bitmap.createBitmap(iconSize, iconSize, Config.ARGB_8888); Canvas canvas=new Canvas(contactIcon); //拷贝图片 Paint iconPaint=new Paint(); iconPaint.setDither(true);//防抖动 iconPaint.setFilterBitmap(true);//用来对Bitmap进行滤波处理,这样,当你选择Drawable时,会有抗锯齿的效果 Rect src=new Rect(0, 0, icon.getWidth(), icon.getHeight()); Rect dst=new Rect(0, 0, iconSize, iconSize); canvas.drawBitmap(icon, src, dst, iconPaint); //在图片上创建一个覆盖的联系人个数 int contacyCount=getContactCount(); //启用抗锯齿和使用设备的文本字距 Paint countPaint=new Paint(Paint.ANTI_ALIAS_FLAG|Paint.DEV_KERN_TEXT_FLAG); countPaint.setColor(Color.RED); countPaint.setTextSize(20f); countPaint.setTypeface(Typeface.DEFAULT_BOLD); canvas.drawText(String.valueOf(contacyCount), iconSize-18, 25, countPaint); return contactIcon; }
    注释的很详细,就不解释了,无非就是定义一个画布(Canvas),然后在上面画图标,画数字文本。
  7. 然后我们把得到的这个处理过的Bitmap放在我们在main.xml里定义的ImageView里展示就可以看到效果了.
    Java代码 复制代码 收藏代码[android]在图标上加提醒的数字
    1. mImageView.setImageBitmap(contactCountIcon);
    mImageView.setImageBitmap(contactCountIcon);
  8. 我们启动应用看看效果.

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

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

  1. 如果我们监听未读短信的数量,展示在状态栏通知了,就可以用这个方法,我这里还是以联系人的数量为例
  2. 由于Notification默认的icon字段使用的是一个一个资源的引用类型int,所以我们这里采用RemoteView的方式自定义Notification。定义RemoteView,需要一个layout,用于定义展示的Notification样式,我们新建一个notification.xml布局文件如下:
    Java代码 复制代码 收藏代码[android]在图标上加提醒的数字
    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. <ImageView android:id="@+id/image"
    8. android:layout_width="wrap_content"
    9. android:layout_height="fill_parent"
    10. android:layout_marginRight="10dp"
    11. /> 
    12. <TextView android:id="@+id/text"
    13. android:layout_width="wrap_content"
    14. android:layout_height="fill_parent"
    15. android:textColor="#000"
    16. /> 
    17. </LinearLayout>
    <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="horizontal" android:layout_width="fill_parent" android:layout_height="fill_parent" android:padding="3dp" > <ImageView android:id="@+id/image" android:layout_width="wrap_content" android:layout_height="fill_parent" android:layout_marginRight="10dp" /> <TextView android:id="@+id/text" android:layout_width="wrap_content" android:layout_height="fill_parent" android:textColor="#000" /> </LinearLayout>
    很简单,一个ImageView和一个TextView,用于显示提示的图标和文字。
  3. 要想使用Notification,我们必须获取一个Service--NotificationManager,Android中由它来管理我们的Notification,获取NotificationManager的代码如下,卸载onCreate方法里
    Java代码 复制代码 收藏代码[android]在图标上加提醒的数字
    1. nm=(NotificationManager)getSystemService(Context.NOTIFICATION_SERVICE);
    nm=(NotificationManager)getSystemService(Context.NOTIFICATION_SERVICE);
  4. 然后紧接着我们就调用我们定义好的方法来显示通知:
    Java代码 复制代码 收藏代码[android]在图标上加提醒的数字
    1. showNotifacation(contactCountIcon);
    showNotifacation(contactCountIcon);
  5. 下面我们看一下方法showNotifacation的具体实现:
    Java代码 复制代码 收藏代码[android]在图标上加提醒的数字
    1. private void showNotifacation(Bitmap icon){ 
    2. Notification notification=new Notification(R.drawable.icon,"联系人数量",System.currentTimeMillis()); 
    3. //使用RemoteView自定义通知视图
    4. RemoteViews contentView=new RemoteViews(getPackageName(), R.layout.notification); 
    5. contentView.setImageViewBitmap(R.id.image, icon); 
    6. contentView.setTextViewText(R.id.text, "图标上的红色数字表示手机中联系人的数量"); 
    7. notification.contentView=contentView; 
    8. Intent notificationIntent=new Intent(this, NotificationIconActivity.class); 
    9. PendingIntent contentIntent=PendingIntent.getActivity(this, 0, notificationIntent, 0); 
    10. notification.contentIntent=contentIntent; 
    11. nm.notify(NOTIFICATION_CONTACT_ID, notification); 
    12. }
     private void showNotifacation(Bitmap icon){ Notification notification=new Notification(R.drawable.icon,"联系人数量",System.currentTimeMillis()); //使用RemoteView自定义通知视图 RemoteViews contentView=new RemoteViews(getPackageName(), R.layout.notification); contentView.setImageViewBitmap(R.id.image, icon); contentView.setTextViewText(R.id.text, "图标上的红色数字表示手机中联系人的数量"); notification.contentView=contentView; Intent notificationIntent=new Intent(this, NotificationIconActivity.class); PendingIntent contentIntent=PendingIntent.getActivity(this, 0, notificationIntent, 0); notification.contentIntent=contentIntent; nm.notify(NOTIFICATION_CONTACT_ID, notification); }
    注释的都很详细,就不一一解释了
  6. 最后的就是重写onDestroy,在Android销毁该Activity的时候清除我们的通知。
    Java代码 复制代码 收藏代码[android]在图标上加提醒的数字
    1. @Override
    2. protected void onDestroy()
    3. super.onDestroy(); 
    4. nm.cancel(NOTIFICATION_CONTACT_ID); 
    5. }
    @Override protected void onDestroy() { super.onDestroy(); nm.cancel(NOTIFICATION_CONTACT_ID); }
  7. 运行,可以看到如下效果
    [android]在图标上加提醒的数字

    [android]在图标上加提醒的数字


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

四:小结和一点引申

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

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值