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代碼  收藏代碼
    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代表我手機中有一個聯繫人

三:採用狀態欄通知的辦法展示聯繫人的數量

  1. 如果我們監聽未讀短信的數量,展示在狀態欄通知了,就可以用這個方法,我這裏還是以聯繫人的數量爲例
  2. 由於Notification默認的icon字段使用的是一個一個資源的引用類型int,所以我們這裏採用RemoteView的方式自定義Notification。定義RemoteView,需要一個layout,用於定義展示的Notification樣式,我們新建一個notification.xml佈局文件如下:
    Java代碼  收藏代碼
    1. <?xml version="1.0" encoding="utf-8"?>  
    2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"  
    3.               android:orientation="horizontal"  
    4.               android:layout_width="fill_parent"  
    5.               android:layout_height="fill_parent"  
    6.               android:padding="3dp"  
    7.               >  
    8.     <ImageView android:id="@+id/image"  
    9.               android:layout_width="wrap_content"  
    10.               android:layout_height="fill_parent"  
    11.               android:layout_marginRight="10dp"  
    12.               />  
    13.     <TextView android:id="@+id/text"  
    14.               android:layout_width="wrap_content"  
    15.               android:layout_height="fill_parent"  
    16.               android:textColor="#000"  
    17.               />  
    18. </LinearLayout>  
     很簡單,一個ImageView和一個TextView,用於顯示提示的圖標和文字。
  3. 要想使用Notification,我們必須獲取一個Service--NotificationManager,Android中由它來管理我們的Notification,獲取NotificationManager的代碼如下,卸載onCreate方法裏
    Java代碼  收藏代碼
    1. nm=(NotificationManager)getSystemService(Context.NOTIFICATION_SERVICE);  
     
  4. 然後緊接着我們就調用我們定義好的方法來顯示通知:
    Java代碼  收藏代碼
    1. showNotifacation(contactCountIcon);  
     
  5. 下面我們看一下方法showNotifacation的具體實現:
    Java代碼  收藏代碼
    1. /** 
    2.  * 顯示狀態欄通知 
    3.  * @param icon 通知內容圖標 
    4.  */  
    5. private void showNotifacation(Bitmap icon){  
    6.     Notification notification=new  Notification(R.drawable.icon,"聯繫人數量",System.currentTimeMillis());  
    7.     //使用RemoteView自定義通知視圖  
    8.     RemoteViews contentView=new RemoteViews(getPackageName(), R.layout.notification);  
    9.     contentView.setImageViewBitmap(R.id.image, icon);  
    10.     contentView.setTextViewText(R.id.text, "圖標上的紅色數字表示手機中聯繫人的數量");  
    11.     notification.contentView=contentView;  
    12.     Intent notificationIntent=new Intent(this, NotificationIconActivity.class);  
    13.     PendingIntent contentIntent=PendingIntent.getActivity(this0, notificationIntent, 0);  
    14.     notification.contentIntent=contentIntent;  
    15.     nm.notify(NOTIFICATION_CONTACT_ID, notification);  
    16. }  
     註釋的都很詳細,就不一一解釋了
  6. 最後的就是重寫onDestroy,在Android銷燬該Activity的時候清除我們的通知。
    Java代碼  收藏代碼
    1. @Override  
    2.     protected void onDestroy() {  
    3.         super.onDestroy();  
    4.         nm.cancel(NOTIFICATION_CONTACT_ID);  
    5.     }  
     
  7. 運行,可以看到如下效果

     可以看到,效果已經出來了。。

四:小結和一點引申

這結的主要關鍵還是對圖片的處理,比如這裏的加上數字,當時你也可以加上其他的東西,Canvas裏有很多相應的函數可以使用。。

 

這裏說的都是應用內、狀態通知等一些顯示處理後圖片的辦法,那麼有沒有方法處理手機主屏幕上的圖標的辦法,爲他們加上數字呢。比如在短信息的應用圖標的右上角加上未讀短信數目等,答案是有的,不過是迂迴實現的,給個思路就是使用AppWidget,這個可以實現,還能動態更新,具體怎麼實現,大家可以自己摸索下,這裏只提供個思路,整體和這節的例子差不多,只不過呢,要做成AppWidget。。。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章