今天实习接到一个小任务,要求给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,100,100,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*2;
int newH = bigH+smallH*2;
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(0, 0, newW, newH), p);
canvas.drawBitmap(bm, (newW - bigW - 2 * smallW) / 2 + smallW, (newH
- bigH - 2 * smallH)
/ 2 + smallH, null);
canvas.save(Canvas.ALL_SAVE_FLAG);
canvas.restore();
return newBitmap;
}
}