在我们开发一些如短消息、应用商店等应用时,会考虑在短消息的图标上加上未读短信的数量,在应用商店上加上可以升级的应用数量,这样不占太大空间还能达到提示的目的。
本节eoe就以一个展示手机内联系人数量的例子来演示怎么在一个图标的上面加上数字的例子,也就是一个数字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,勇于预览我们处理好的加上数字的图标。
LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 03. android:orientation="vertical" 04. android:layout_width="fill_parent" 05. android:layout_height="fill_parent" 06. > 07. <ImageView 08. android:id="@+id/icon" 09. android:layout_width="wrap_content" 10. android:layout_height="wrap_content" 11. android:scaleType="center" 12. android:adjustViewBounds="true"/> 13.</LinearLayout>
4.先来获取手机内通讯录的图标,如果没有获取到,则使用该应用的图标.
super.onCreate(savedInstanceState); 02. setContentView(R.layout.main); 03. mImageView=(ImageView)findViewById(R.id.icon); 04. //优先采用联系人的图标,如果不存在则采用该应用的图标 05. Drawable contactIcon; 06. try { 07. contactIcon = getPackageManager().getApplicationIcon("com.android.contacts"); 08. } catch (NameNotFoundException e) { 09. 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获取图片的函数,很简单,代码如下:
/** 02. * 根据id获取一个图片 03. * @param res 04. * @param resId 05. * @return 06. */ 07. private Bitmap getResIcon(Resources res,int resId){ 08. Drawable icon=res.getDrawable(resId); 09. if(icon instanceof BitmapDrawable){ 10. BitmapDrawable bd=(BitmapDrawable)icon; 11. return bd.getBitmap(); 12. }else{ 13. return null; 14. } 15. }
5.获取到图标之后就要对这个图标进行处理了,要为该图标加上联系人数量的覆盖,首先我们看获取联系人个数的函数。
/** 02. * 获取联系人的个数 03. * @return 手里通讯录中联系人的个数 04. */ 05. private int getContactCount(){ 06. Cursor c=getContentResolver().query(ContactsContract.Contacts.CONTENT_URI, new String[]{ContactsContract.Contacts._COUNT}, null, null, null); 07. try{ 08. c.moveToFirst(); 09. return c.getInt(0); 10. }catch(Exception e){ 11. return 0; 12. }finally{ 13. c.close(); 14. } 15. }
这里采用Uri的方式获取联系人的cursor,然后获取个数。
6. 有了图标和联系人个数就可以生成带联系人个数的图标了,我们看下生成的这个函数。
/** 02. * 在给定的图片的右上角加上联系人数量。数量用红色表示 03. * @param icon 给定的图片 04. * @return 带联系人数量的图片 05. */ 06. private Bitmap generatorContactCountIcon(Bitmap icon){ 07. //初始化画布 08. int iconSize=(int)getResources().getDimension(android.R.dimen.app_icon_size); 09. 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. //拷贝图片 14. Paint iconPaint=new Paint(); 15. iconPaint.setDither(true);//防抖动 16. iconPaint.setFilterBitmap(true);//用来对Bitmap进行滤波处理,这样,当你选择Drawable时,会有抗锯齿的效果 17. Rect src=new Rect(0, 0, icon.getWidth(), icon.getHeight()); 18. Rect dst=new Rect(0, 0, iconSize, iconSize); 19. canvas.drawBitmap(icon, src, dst, iconPaint); 20. 21. //在图片上创建一个覆盖的联系人个数 22. int contacyCount=getContactCount(); 23. //启用抗锯齿和使用设备的文本字距 24. Paint countPaint=new Paint(Paint.ANTI_ALIAS_FLAG|Paint.DEV_KERN_TEXT_FLAG); 25. countPaint.setColor(Color.RED); 26. countPaint.setTextSize(20f); 27. countPaint.setTypeface(Typeface.DEFAULT_BOLD); 28. canvas.drawText(String.valueOf(contacyCount), iconSize-18, 25, countPaint); 29. return contactIcon; 30. }