2011.09.13(2)——— android 图标上面添加数字

2011.09.13(2)——— android 图标上面添加数字

参考:http://flysnow.iteye.com/blog/906770

 

 

 

  1. 新建名为NotificationIconCount的Android Project。
  2. 首先修改AndroidManifest.xml,加入权限<uses-permission android:name="android.permission.READ_CONTACTS"></uses-permission>,因为我们要读取联系人。
  3. 修改main.xml如下,这里定义一个ImageView,勇于预览我们处理好的加上数字的图标。
    Xml代码   收藏代码
    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. 先来获取手机内通讯录的图标,如果没有获取到,则使用该应用的图标.
    Java代码   收藏代码
    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获取图片的函数,很简单,代码如下:
    Java代码   收藏代码
    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. 获取到图标之后就要对这个图标进行处理了,要为该图标加上联系人数量的覆盖,首先我们看获取联系人个数的函数。
    Java代码   收藏代码
    1. /** 
    2.      * 获取联系人的个数 
    3.      * @return 手里通讯录中联系人的个数 
    4.      */  
    5.     private int getContactCount(){  
    6.         Cursor c=getContentResolver().query(ContactsContract.Contacts.CONTENT_URI, new String[]{ContactsContract.Contacts._COUNT}, nullnullnull);  
    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. 有了图标和联系人个数就可以生成带联系人个数的图标了,我们看下生成的这个函数。
    Java代码   收藏代码
    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.         //拷贝图片  
    14.         Paint iconPaint=new Paint();  
    15.         iconPaint.setDither(true);//防抖动  
    16.         iconPaint.setFilterBitmap(true);//用来对Bitmap进行滤波处理,这样,当你选择Drawable时,会有抗锯齿的效果  
    17.         Rect src=new Rect(00, icon.getWidth(), icon.getHeight());  
    18.         Rect dst=new Rect(00, 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-1825, countPaint);  
    29.         return contactIcon;  
    30.     }  
     注释的很详细,就不解释了,无非就是定义一个画布(Canvas),然后在上面画图标,画数字文本。
  7. 然后我们把得到的这个处理过的Bitmap放在我们在main.xml里定义的ImageView里展示就可以看到效果了.
    Java代码   收藏代码
    1. mImageView.setImageBitmap(contactCountIcon);  
     
  8. 我们启动应用看看效果.

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

你可能感兴趣的:(android)