Android中為圖標(biāo)加上數(shù)字--用于未讀短信數(shù)提醒,待更新應(yīng)用數(shù)提醒等
|
admin
2014年11月24日 21:56
本文熱度 5781
|
在我們開(kāi)發(fā)一些如短消息、應(yīng)用商店等應(yīng)用時(shí),會(huì)考慮在短消息的圖標(biāo)上加上未讀短信的數(shù)量,在應(yīng)用商店上加上可以升級(jí)的應(yīng)用數(shù)量,這樣不占太大空間還能達(dá)到提示的目的。 本節(jié)就以一個(gè)展示手機(jī)內(nèi)聯(lián)系人數(shù)量的例子來(lái)演示怎么在一個(gè)圖標(biāo)的上面加上數(shù)字的例子,也就是一個(gè)數(shù)字overlay..做過(guò)google map開(kāi)發(fā)的知道overlay這個(gè)東西。。
一:你可學(xué)到
- 手機(jī)內(nèi)依據(jù)Uri查看聯(lián)系人
- 權(quán)限的添加
- 獲取手機(jī)內(nèi)任意一款應(yīng)用的應(yīng)用圖標(biāo)
- 對(duì)圖形的處理,如復(fù)制,為圖片加上覆蓋層--數(shù)字。
- 使用RemoteView自定義Notification
二:開(kāi)始行動(dòng)
- 新建名為NotificationIconCount的Android Project。附件中有最終版本的項(xiàng)目工程
- 首先修改AndroidManifest.xml,加入權(quán)限<uses-permission android:name="android.permission.READ_CONTACTS"></uses-permission>,因?yàn)槲覀円x取聯(lián)系人。
- 修改main.xml如下,這里定義一個(gè)ImageView,勇于預(yù)覽我們處理好的加上數(shù)字的圖標(biāo)。
- <?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>
- 先來(lái)獲取手機(jī)內(nèi)通訊錄的圖標(biāo),如果沒(méi)有獲取到,則使用該應(yīng)用的圖標(biāo).
- 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);
- }
這里用到一個(gè)自定義的根據(jù)資源圖標(biāo)id獲取圖片的函數(shù),很簡(jiǎn)單,代碼如下:
-
-
-
-
-
-
- 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;
- }
- }
- 獲取到圖標(biāo)之后就要對(duì)這個(gè)圖標(biāo)進(jìn)行處理了,要為該圖標(biāo)加上聯(lián)系人數(shù)量的覆蓋,首先我們看獲取聯(lián)系人個(gè)數(shù)的函數(shù)。
-
-
-
-
- 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的方式獲取聯(lián)系人的cursor,然后獲取個(gè)數(shù)。
- 有了圖標(biāo)和聯(lián)系人個(gè)數(shù)就可以生成帶聯(lián)系人個(gè)數(shù)的圖標(biāo)了,我們看下生成的這個(gè)函數(shù)。
-
-
-
-
-
- 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);
- 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;
- }
注釋的很詳細(xì),就不解釋了,無(wú)非就是定義一個(gè)畫(huà)布(Canvas),然后在上面畫(huà)圖標(biāo),畫(huà)數(shù)字文本。
- 然后我們把得到的這個(gè)處理過(guò)的Bitmap放在我們?cè)趍ain.xml里定義的ImageView里展示就可以看到效果了.
- mImageView.setImageBitmap(contactCountIcon);
- 我們啟動(dòng)應(yīng)用看看效果.
 我們看到了,右上角紅色的1代表我手機(jī)中有一個(gè)聯(lián)系人
三:采用狀態(tài)欄通知的辦法展示聯(lián)系人的數(shù)量
- 如果我們監(jiān)聽(tīng)未讀短信的數(shù)量,展示在狀態(tài)欄通知了,就可以用這個(gè)方法,我這里還是以聯(lián)系人的數(shù)量為例
- 由于Notification默認(rèn)的icon字段使用的是一個(gè)一個(gè)資源的引用類(lèi)型int,所以我們這里采用RemoteView的方式自定義Notification。定義RemoteView,需要一個(gè)layout,用于定義展示的Notification樣式,我們新建一個(gè)notification.xml布局文件如下:
- <?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>
很簡(jiǎn)單,一個(gè)ImageView和一個(gè)TextView,用于顯示提示的圖標(biāo)和文字。
- 要想使用Notification,我們必須獲取一個(gè)Service--NotificationManager,Android中由它來(lái)管理我們的Notification,獲取NotificationManager的代碼如下,卸載onCreate方法里
- nm=(NotificationManager)getSystemService(Context.NOTIFICATION_SERVICE);
- 然后緊接著我們就調(diào)用我們定義好的方法來(lái)顯示通知:
- showNotifacation(contactCountIcon);
- 下面我們看一下方法showNotifacation的具體實(shí)現(xiàn):
-
-
-
-
- private void showNotifacation(Bitmap icon){
- Notification notification=new Notification(R.drawable.icon,"聯(lián)系人數(shù)量",System.currentTimeMillis());
-
- RemoteViews contentView=new RemoteViews(getPackageName(), R.layout.notification);
- contentView.setImageViewBitmap(R.id.image, icon);
- contentView.setTextViewText(R.id.text, "圖標(biāo)上的紅色數(shù)字表示手機(jī)中聯(lián)系人的數(shù)量");
- 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);
- }
注釋的都很詳細(xì),就不一一解釋了
- 最后的就是重寫(xiě)onDestroy,在Android銷(xiāo)毀該Activity的時(shí)候清除我們的通知。
- @Override
- protected void onDestroy() {
- super.onDestroy();
- nm.cancel(NOTIFICATION_CONTACT_ID);
- }
- 運(yùn)行,可以看到如下效果
 可以看到,效果已經(jīng)出來(lái)了。。
四:小結(jié)和一點(diǎn)引申
這結(jié)的主要關(guān)鍵還是對(duì)圖片的處理,比如這里的加上數(shù)字,當(dāng)時(shí)你也可以加上其他的東西,Canvas里有很多相應(yīng)的函數(shù)可以使用。。
這里說(shuō)的都是應(yīng)用內(nèi)、狀態(tài)通知等一些顯示處理后圖片的辦法,那么有沒(méi)有方法處理手機(jī)主屏幕上的圖標(biāo)的辦法,為他們加上數(shù)字呢。比如在短信息的應(yīng)用圖標(biāo)的右上角加上未讀短信數(shù)目等,答案是有的,不過(guò)是迂回實(shí)現(xiàn)的,給個(gè)思路就是使用AppWidget,這個(gè)可以實(shí)現(xiàn),還能動(dòng)態(tài)更新,具體怎么實(shí)現(xiàn),大家可以自己摸索下,這里只提供個(gè)思路,整體和這節(jié)的例子差不多,只不過(guò)呢,要做成AppWidget。。。
該文章在 2014/11/24 21:56:52 編輯過(guò)
|
|