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 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.  先来获取手机内通讯录的图标,如果没有获取到,则使用该应用的图标.
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获取图片的函数,很简单,代码如下:
/** 
    * 根据id获取一个图片 
    * @param res 
    * @param resId 
    * @return 
    */  
   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.  获取到图标之后就要对这个图标进行处理了,要为该图标加上联系人数量的覆盖,首先我们看获取联系人个数的函数。

/** 
     * 获取联系人的个数 
     * @return 手里通讯录中联系人的个数 
     */  
    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.  有了图标和联系人个数就可以生成带联系人个数的图标了,我们看下生成的这个函数。

/** 
     * 在给定的图片的右上角加上联系人数量。数量用红色表示 
     * @param icon 给定的图片 
     * @return 带联系人数量的图片 
     */  
    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里展示就可以看到效果了.

mImageView.setImageBitmap(contactCountIcon); 

8.   我们启动应用看看效果.


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

http://blog.csdn.net/listening_music/article/details/7172438

相关文章
|
6月前
|
Java Android开发
Android系统 修改无源码普通应用为默认Launcher和隐藏Settings中应用信息图标
Android系统 修改无源码普通应用为默认Launcher和隐藏Settings中应用信息图标
868 0
|
1月前
|
Android开发
Android开发表情emoji功能开发
本文介绍了一种在Android应用中实现emoji表情功能的方法,通过将图片与表情字符对应,实现在`TextView`中的正常显示。示例代码展示了如何使用自定义适配器加载emoji表情,并在编辑框中输入或删除表情。项目包含完整的源码结构,可作为开发参考。视频演示和源码详情见文章内链接。
71 4
Android开发表情emoji功能开发
|
30天前
|
安全 Android开发 iOS开发
Android vs iOS:探索移动操作系统的设计与功能差异###
【10月更文挑战第20天】 本文深入分析了Android和iOS两个主流移动操作系统在设计哲学、用户体验、技术架构等方面的显著差异。通过对比,揭示了这两种系统各自的独特优势与局限性,并探讨了它们如何塑造了我们的数字生活方式。无论你是开发者还是普通用户,理解这些差异都有助于更好地选择和使用你的移动设备。 ###
49 3
|
3月前
|
编解码 测试技术 Android开发
Android经典实战之用 CameraX 库实现高质量的照片和视频拍摄功能
本文详细介绍了如何利用CameraX库实现高质量的照片及视频拍摄功能,包括添加依赖、初始化、权限请求、配置预览与捕获等关键步骤。此外,还特别针对不同分辨率和帧率的视频拍摄提供了性能优化策略,确保应用既高效又稳定。
346 1
Android经典实战之用 CameraX 库实现高质量的照片和视频拍摄功能
|
6月前
|
Android开发
Android 状态栏WiFi图标的显示逻辑
Android 状态栏WiFi图标的显示逻辑
166 0
|
2月前
|
Android开发 开发者
Android平台无纸化同屏如何实现实时录像功能
Android平台无纸化同屏,如果需要本地录像的话,实现难度不大,只要复用之前开发的录像模块的就可以,对我们来说,同屏采集这块,只是数据源不同而已,如果是自采集的其他数据,我们一样可以编码录像。
|
3月前
|
图形学 Android开发
小功能⭐️Unity调用Android常用事件
小功能⭐️Unity调用Android常用事件
|
3月前
|
Android开发
解决android apk安装后出现2个相同的应用图标
解决android apk安装后出现2个相同的应用图标
349 2
|
3月前
|
XML Android开发 数据格式
Android实战经验之Kotlin中快速实现动态更改应用图标和名称
本文介绍在Android中通过设置多个活动别名动态更改应用图标和名称的方法,涉及XML配置及Kotlin代码示例。
162 10
|
5月前
|
数据库 Android开发 数据安全/隐私保护
在 Android Studio 中结合使用 SQLite 数据库实现简单的注册和登录功能
在 Android Studio 中结合使用 SQLite 数据库实现简单的注册和登录功能
237 2
下一篇
无影云桌面