Android实现图标水印

Android图标数字水印的用途:

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& gt;,因为我们要读取联系人。
3.修改main.xml如下,这里定义一个ImageView,勇于预览我们处理好的加上数字的图标。

<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>  

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 java版2分查询

  * @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;  
}  

来自:http://www.itstrike.cn/Question/b643ea5b-2167-4b60-a3f7-1bddf259b98d

posted @ 2011-08-31 10:27  ctou45  阅读(448)  评论(0编辑  收藏  举报