当前位置: 代码迷 >> Android >> 2011.09.13(二)——— android 图标上面添加数字
  详细解决方案

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

热度:83   发布时间:2016-05-01 18:56:31.0
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. [email protected]?
    4. [email protected]?
    5. [email protected]?
    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. [email protected]?
    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. 有了图标和联系人个数就可以生成带联系人个数的图标了,我们看下生成的这个函数。
    Java代码??收藏代码
    1. /**?
    2. ?????*?在给定的图片的右上角加上联系人数量。数量用红色表示?
    3. [email protected]?
    4. [email protected]?
    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(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. ????}??
    ?注释的很详细,就不解释了,无非就是定义一个画布(Canvas),然后在上面画图标,画数字文本。
  7. 然后我们把得到的这个处理过的Bitmap放在我们在main.xml里定义的ImageView里展示就可以看到效果了.
    Java代码??收藏代码
    1. mImageView.setImageBitmap(contactCountIcon);??
    ?
  8. 我们启动应用看看效果.

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

  相关解决方案