Android中为图标加上数字--用于未读短信数提醒等
来源:互联网 发布:演唱会软件推荐 编辑:程序博客网 时间:2024/06/05 22:48
Android中为图标加上数字--用于未读短信数提醒等 楼主
相信自己
相信自己当前离线
No.2 搬砖工人该用户从未签到
21
主题51
帖子187
e币- 发消息
发表于 2011-4-8 18:13:45 |只看该作者 |倒序浏览|阅读模式
本帖最后由 西门雨茹 于 2011-4-8 18:15 编辑
在我们开发一些如短消息、应用商店等应用时,会考虑在短消息的图标上加上未读短信的数量,在应用商店上加上可以升级的应用数量,这样不占太大空间还能达到提示的目的。
本节eoe就以一个展示手机内联系人数量的例子来演示怎么在一个图标的上面加上数字的例子,也就是一个数字overlay。做过google map开发的知道overlay这个东西。
一:你可学到
二:开始行动
Xml代码:
复制代码4.先来获取手机内通讯录的图标,如果没有获取到,则使用该应用的图标.
Java代码:
复制代码这里用到一个自定义的根据资源图标id获取图片的函数,很简单,代码如下:
Java代码:
复制代码5.获取到图标之后就要对这个图标进行处理了,要为该图标加上联系人数量的覆盖,首先我们看获取联系人个数的函数。
Java代码:
复制代码这里采用Uri的方式获取联系人的cursor,然后获取个数。
6. 有了图标和联系人个数就可以生成带联系人个数的图标了,我们看下生成的这个函数。
Java代码:
复制代码注释的很详细,就不解释了,无非就是定义一个画布(Canvas),然后在上面画图标,画数字文本。
7.然后我们把得到的这个处理过的Bitmap放在我们在main.xml里定义的ImageView里展示就可以看到效果了.
Java代码:
复制代码8.我们启动应用看看效果.
我们看到了,右上角红色的1代表我手机中有一个联系人
三:采用状态栏通知的办法展示联系人的数量
1. 如果我们监听未读短信的数量,展示在状态栏通知了,就可以用这个方法,我这里还是以联系人的数量为例
2. 由于Notification默认的icon字段使用的是一个一个资源的引用类型int,所以我们这里采用RemoteView的方式自定义 Notification。定义RemoteView,需要一个layout,用于定义展示的Notification样式,我们新建一个notification.xml布局文件如下:
Java代码:
复制代码很简单,一个ImageView和一个TextView,用于显示提示的图标和文字。
3.要想使用Notification,我们必须获取一个Service--NotificationManager,Android中由它来管理我们的Notification,获取NotificationManager的代码如下,卸载onCreate方法里
Java代码:
复制代码4.然后紧接着我们就调用我们定义好的方法来显示通知:
Java代码:
复制代码5.下面我们看一下方法showNotifacation的具体实现:
Java代码:
复制代码注释的都很详细,就不一一解释了
6.最后的就是重写onDestroy,在Android销毁该Activity的时候清除我们的通知。
Java代码:
复制代码7.运行,可以看到如下效果
可以看到,效果已经出来了。。
四:小结和一点引申
这结的主要关键还是对图片的处理,比如这里的加上数字,当时你也可以加上其他的东西,Canvas里有很多相应的函数可以使用。
这里说的都是应用内、状态通知等一些显示处理后图片的办法,那么有没有方法处理手机主屏幕上的图标的办法,为他们加上数字呢。比如在短信息的应用图标的右上角加上未读短信数目等,答案是有的,不过是迂回实现的,给个思路就是使用 AppWidget,这个可以实现,还能动态更新,具体怎么实现,大家可以自己摸索下,这里只提供个思路,整体和这节的例子差不多,只不过呢,要做成 AppWidget 。
在我们开发一些如短消息、应用商店等应用时,会考虑在短消息的图标上加上未读短信的数量,在应用商店上加上可以升级的应用数量,这样不占太大空间还能达到提示的目的。
本节eoe就以一个展示手机内联系人数量的例子来演示怎么在一个图标的上面加上数字的例子,也就是一个数字overlay。做过google map开发的知道overlay这个东西。
一:你可学到
- 手机内依据Uri查看联系人
- 权限的添加
- 获取手机内任意一款应用的应用图标
- 对图形的处理,如复制,为图片加上覆盖层--数字。
- 使用RemoteView自定义Notification
二:开始行动
- 新建名为NotificationIconCount的Android Project。附件中有最终版本的项目工程
- 首先修改AndroidManifest.xml,加入权限<uses-permission android:name="android.permission.READ_CONTACTS"></uses-permission>,因为我们要读取联系人。
- 修改main.xml如下,这里定义一个ImageView,勇于预览我们处理好的加上数字的图标。
Xml代码:
- <?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>
Java代码:
- 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);
- }
Java代码:
- /**
- * 根据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;
- }
- }
Java代码:
- /**
- * 获取联系人的个数
- * @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();
- }
- }
6. 有了图标和联系人个数就可以生成带联系人个数的图标了,我们看下生成的这个函数。
Java代码:
- /**
- * 在给定的图片的右上角加上联系人数量。数量用红色表示
- * @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;
- }
7.然后我们把得到的这个处理过的Bitmap放在我们在main.xml里定义的ImageView里展示就可以看到效果了.
Java代码:
- mImageView.setImageBitmap(contactCountIcon);
我们看到了,右上角红色的1代表我手机中有一个联系人
三:采用状态栏通知的办法展示联系人的数量
1. 如果我们监听未读短信的数量,展示在状态栏通知了,就可以用这个方法,我这里还是以联系人的数量为例
2. 由于Notification默认的icon字段使用的是一个一个资源的引用类型int,所以我们这里采用RemoteView的方式自定义 Notification。定义RemoteView,需要一个layout,用于定义展示的Notification样式,我们新建一个notification.xml布局文件如下:
Java代码:
- <?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>
3.要想使用Notification,我们必须获取一个Service--NotificationManager,Android中由它来管理我们的Notification,获取NotificationManager的代码如下,卸载onCreate方法里
Java代码:
- nm=(NotificationManager)getSystemService(Context.NOTIFICATION_SERVICE);
Java代码:
- showNotifacation(contactCountIcon);
Java代码:
- /**
- * 显示状态栏通知
- * @param icon 通知内容图标
- */
- 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代码:
- @Override
- protected void onDestroy() {
- super.onDestroy();
- nm.cancel(NOTIFICATION_CONTACT_ID);
- }
可以看到,效果已经出来了。。
四:小结和一点引申
这结的主要关键还是对图片的处理,比如这里的加上数字,当时你也可以加上其他的东西,Canvas里有很多相应的函数可以使用。
这里说的都是应用内、状态通知等一些显示处理后图片的办法,那么有没有方法处理手机主屏幕上的图标的办法,为他们加上数字呢。比如在短信息的应用图标的右上角加上未读短信数目等,答案是有的,不过是迂回实现的,给个思路就是使用 AppWidget,这个可以实现,还能动态更新,具体怎么实现,大家可以自己摸索下,这里只提供个思路,整体和这节的例子差不多,只不过呢,要做成 AppWidget 。
Activity,View, 工程, Manifest, Resource
评分
参与人数1 e币 +2 收起 理由 xpath+ 2很给力!查看全部评分
分享到: QQ好友和群QQ空间腾讯微博腾讯朋友
收藏56淘帖0好评6差评0相关帖子
- • MAC上的AndroidStudio的工程能否直接导入windows中的
- • 求解:ListView 删除条目 后 刷新 设置当前条目为下一个条目
- • 百度贴吧这种滑动结束activity怎么实现
- • 两个activity之间传值的问题
- • 打开另一activity出错
- • activity页面打开出错
- • android 如何分包 完整详细的教程
- • 一个新的activity页面,怎样自动建oncreate?
- • fragment的问题
- • 关于在主线程中自动弹出popuwindow
回复
举报
安于卓越
安于卓越当前离线
No.1 码农该用户从未签到
0
主题2
帖子43
e币- 发消息
推荐
发表于 2015-1-23 16:27:48 |只看该作者
共同提高技术,共同进步
回复支持 反对
举报
zhangkaipeng
zhangkaipeng当前离线
No.4 见习攻城师签到天数: 16 天
连续签到: 1 天
[LV.4]偶尔看看III
0
主题133
帖子678
e币- 发消息
推荐
发表于 2014-10-27 09:42:18 |只看该作者
LZ 你好 我现在能获取到桌面的图标并且更改 但是如何能把更改后的图标设置回桌面呢
回复支持 反对
举报
豚鼠特工
豚鼠特工当前在线
No.2 搬砖工人签到天数: 51 天
连续签到: 2 天
[LV.5]常住居民I
1
主题94
帖子13
e币- 发消息
推荐
发表于 2015-9-24 10:28:08 |只看该作者
那么,程序本身的图标呢,这么加数字?
回复支持 反对
举报
mengshu
mengshu当前离线
No.6 资深工程师签到天数: 22 天
连续签到: 1 天
[LV.4]偶尔看看III
16
主题1188
帖子3455
e币- 发消息
5楼
发表于 2011-4-8 19:53:47 |只看该作者
收藏了
回复支持 反对
举报
avelcon
avelcon当前离线
No.5 攻城师签到天数: 1 天
连续签到: 1 天
[LV.1]初来乍到
6
主题271
帖子964
e币- 发消息
6楼
发表于 2011-4-9 16:07:26 |只看该作者
回复支持 反对
举报
ajiloveu
ajiloveu当前离线
No.5 攻城师该用户从未签到
14
主题711
帖子1072
e币- 发消息
7楼
发表于 2011-4-10 13:04:41 |只看该作者
这么好的帖子没人顶?一些开发者们干什么去了。
0 0
- Android中为图标加上数字--用于未读短信数提醒等
- Android中为图标加上数字--用于未读短信数提醒等
- Android中为图标加上数字--用于未读短信数提醒,待更新应用数提醒等
- Android中为图标加上数字--用于未读短信数提醒,待更新应用数提醒等
- Android中为图标加上数字--用于未读短信数提醒,待更新应用数提醒等
- Android中为图标加上数字--用于未读短信数提醒,待更新应用数提醒等
- Android中为图标加上数字--用于未读短信数提醒,待更新应用数提醒等
- Android中为图标加上数字--用于未读短信数提醒,待更新应用数提醒等
- Android中为图标加上数字--用于未读短信数提醒,待更新应用数提醒等
- Android中为图标加上数字--用于未读短信数提醒,待更新应用数提醒等
- Android中给图标加上数字(用于未接来电等等功能的提醒)
- Android中给图标加上数字(用于未接来电等等功能的提醒)
- Launcher中拨号、短信图标加数字提示未接电话、未读短信数量
- Android 之应用启动图标未读消息BadgeNumber动态提醒(如微信 QQ等)
- android 桌面快捷键未读的消息数目,未接来电,短信提醒那个右上角的数字
- android 桌面快捷键未读的消息数目,未接来电,短信提醒那个右上角的数字
- Android系统 小米/三星/索尼 应用启动图标未读消息数(BadgeNumber)动态提醒
- Android系统 小米/三星/索尼 应用启动图标未读消息数(BadgeNumber)动态提醒
- 最小角回归笔记
- XCode快捷键
- ASP.Net MVC开发基础学习笔记(6):Model和Entity Framework
- [ddmlib] 您的主机中的软件中止了一个已建立的连接。 java.io.IOException: 您的主机中的软件中止了一个已建立的连接。
- Android总结 - Fragment
- Android中为图标加上数字--用于未读短信数提醒等
- iOS中堆和栈的区别
- ARP笔记
- IOS UIView 渐变色
- Android PackageManager
- tomcat无法识别maven工程
- linux socket 编程(C语言)
- 使用ssh远程重装centos
- ‘ORA-00904: "AGE": invalid identifier’ The association between double quote and case sensitivity