android圖標上面添加數字 – Android移動開發技術文章_手機開發 Android移動開發教學課程

新建名為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); 
        } 
 這裡用到一個自定義的根據資源圖標id獲取圖片的函數,很簡單,代碼如下:
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(); 
        } 
    } 
 這裡采用Uri的方式獲取聯系人的cursor,然後獲取個數。
有瞭圖標和聯系人個數就可以生成帶聯系人個數的圖標瞭,我們看下生成的這個函數。
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; 
    } 
 註釋的很詳細,就不解釋瞭,無非就是定義一個畫佈(Canvas),然後在上面畫圖標,畫數字文本。
然後我們把得到的這個處理過的Bitmap放在我們在main.xml裡定義的ImageView裡展示就可以看到效果瞭.
Java代碼 
mImageView.setImageBitmap(contactCountIcon); 
 
我們啟動應用看看效果.

 我們看到瞭,右上角紅色的1代表我手機中有一個聯系人

作者“TryLoveCatch”
 

發佈留言