今天實習接到一個小任務,要求給ListView中ImageView的圖檔添加純色的邊框,來差別内容和背景。首先想到的方法就是利用ImageView的wrap_content以及magin屬性,在其外面嵌套一層布局,或者在ImageView中定義@background屬性,指向一個shape布局,查了資料之後發現還有利用自定義ImageView的。
于是打開工程動手做起來,一打開布局檔案發現ImageView是固定大小的,似乎上面三種方法都行不通..。嘗試将ImageView屬性改為wrap_content,這樣一來又要考慮到縮放,對整個工程影響可能比較大。同時ImageView的邊框有些時候不需要顯示(比如檔案在下載下傳,或者是一個檔案夾圖示),于是轉而嘗試直接在bitmap裡面動手腳。可惜入行不久對Bitmap以及畫筆不是特别了解。。故繼續查閱資料,發現一篇類似的文章: http://blog.csdn.net/SJF0115/article/details/7267056
原文是要在圖檔上加入比較複雜的圖檔邊框,修改一下就達到了我要的效果。就是利用canvas畫一個比原圖檔大德矩形,然後再畫上原圖,搞定!最後别忘記加上null的判斷。。
public class MainActivity extends Activity {
private ImageView ImageView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
ImageView = (ImageView) findViewById(R.id.imageview);
Bitmap bmp = BitmapFactory.decodeResource(getResources(),
R.drawable.image_bg);
ImageView.setImageBitmap(bitmapCombine(bmp,,,Color.GREEN));
}
/**
* 獲得添加邊框了的Bitmap
* @param bm 原始圖檔Bitmap
* @param smallW 一條邊框寬度
* @param smallH 一條邊框高度
* @param color 邊框顔色值
* @return Bitmap 添加邊框了的Bitmap
*/
private Bitmap bitmapCombine(Bitmap bm, int smallW, int smallH,int color) {
//防止空指針異常
if(bm==null){
return null;
}
// 原圖檔的寬高
final int bigW = bm.getWidth();
final int bigH = bm.getHeight();
// 重新定義大小
int newW = bigW+smallW*;
int newH = bigH+smallH*;
// 繪原圖
Bitmap newBitmap = Bitmap.createBitmap(newW, newH, Config.ARGB_8888);
Canvas canvas = new Canvas(newBitmap);
Paint p = new Paint();
p.setColor(color);
canvas.drawRect(new Rect(, , newW, newH), p);
// 繪邊框
canvas.drawBitmap(bm, (newW - bigW - * smallW) / + smallW, (newH
- bigH - * smallH)
/ + smallH, null);
canvas.save(Canvas.ALL_SAVE_FLAG);
canvas.restore();
return newBitmap;
}
}