狠狠色丁香婷婷综合尤物/久久精品综合一区二区三区/中国有色金属学报/国产日韩欧美在线观看 - 国产一区二区三区四区五区tv

LOGO OA教程 ERP教程 模切知識交流 PMS教程 CRM教程 開發文檔 其他文檔  
 
網站管理員

Android中為圖標加上數字--用于未讀短信數提醒,待更新應用數提醒等

admin
2014年11月24日 21:56 本文熱度 5785
在我們開發一些如短消息、應用商店等應用時,會考慮在短消息的圖標上加上未讀短信的數量,在應用商店上加上可以升級的應用數量,這樣不占太大空間還能達到提示的目的。

本節就以一個展示手機內聯系人數量的例子來演示怎么在一個圖標的上面加上數字的例子,也就是一個數字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}, null, null, null);

    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. Paint iconPaint=new Paint();

    14. iconPaint.setDither(true);//防抖動

    15. iconPaint.setFilterBitmap(true);//用來對Bitmap進行濾波處理,這樣,當你選擇Drawable時,會有抗鋸齒的效果

    16. Rect src=new Rect(0, 0, icon.getWidth(), icon.getHeight());

    17. Rect dst=new Rect(0, 0, iconSize, iconSize);

    18. canvas.drawBitmap(icon, src, dst, iconPaint);


    19. //在圖片上創建一個覆蓋的聯系人個數

    20. int contacyCount=getContactCount();

    21. //啟用抗鋸齒和使用設備的文本字距

    22. Paint countPaint=new Paint(Paint.ANTI_ALIAS_FLAG|Paint.DEV_KERN_TEXT_FLAG);

    23. countPaint.setColor(Color.RED);

    24. countPaint.setTextSize(20f);

    25. countPaint.setTypeface(Typeface.DEFAULT_BOLD);

    26. canvas.drawText(String.valueOf(contacyCount), iconSize-18, 25, countPaint);

    27. return contactIcon;

    28. }
    注釋的很詳細,就不解釋了,無非就是定義一個畫布(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(this, 0, 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。。。




該文章在 2014/11/24 21:56:52 編輯過
關鍵字查詢
相關文章
正在查詢...
點晴ERP是一款針對中小制造業的專業生產管理軟件系統,系統成熟度和易用性得到了國內大量中小企業的青睞。
點晴PMS碼頭管理系統主要針對港口碼頭集裝箱與散貨日常運作、調度、堆場、車隊、財務費用、相關報表等業務管理,結合碼頭的業務特點,圍繞調度、堆場作業而開發的。集技術的先進性、管理的有效性于一體,是物流碼頭及其他港口類企業的高效ERP管理信息系統。
點晴WMS倉儲管理系統提供了貨物產品管理,銷售管理,采購管理,倉儲管理,倉庫管理,保質期管理,貨位管理,庫位管理,生產管理,WMS管理系統,標簽打印,條形碼,二維碼管理,批號管理軟件。
點晴免費OA是一款軟件和通用服務都免費,不限功能、不限時間、不限用戶的免費OA協同辦公管理系統。
Copyright 2010-2025 ClickSun All Rights Reserved