Android中給圖標加上數字(用於未接來電等等功能的提醒)
在我們開發一些如短消息、應用商店等應用時,會考慮在短消息的圖標上加上未讀短信的數量,在應用商店上加上可以升級的應用數量,這樣不占太大空間還能達到提示的目的。本節就以一個展示手機內聯係人數量的例子來演示怎麼在一個圖標的上麵加上數字的例子,也就是一個數字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 version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:andro
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
>
<ImageView
android:
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代表我手機中有一個聯係人
https://blog.csdn.net/listening_music/article/details/7172438
最後更新:2017-04-02 15:15:14