1、View显示在界面上可以使用如下方法:
private Bitmap getBitmapByCash(View view){ view.setDrawingCacheEnabled(true); view.buildDrawingCache(); //启用DrawingCache并创建位图 Bitmap bitmap = Bitmap.createBitmap(view.getDrawingCache()); //创建一个DrawingCache的拷贝,因为DrawingCache得到的位图在禁用后会被回收 view.setDrawingCacheEnabled(false); //禁用DrawingCahce否则会影响性能 return bitmap; }
2、View没有显示时,如需要根据一个layout文件得到对应的bitmap
此时如果使用第一种方法,是得不到bitmap的,需要使用如下方法:
private Bitmap loadBitmapFromView(View v) { int w = v.getWidth(); int h = v.getHeight(); Bitmap bmp = Bitmap.createBitmap(w, h, Bitmap.Config.ARGB_8888); Canvas c = new Canvas(bmp); /** 如果不设置canvas画布为白色,则生成透明 */ c.drawColor(Color.WHITE); v.layout(0, 0, w, h); v.draw(c); return bmp; }
注意:使用第二种方法前,必须调用如下如下方法,否则在getWith()和getHeight()时,得到的值为0,因为View在添加到容器中之前并没有得到实际的大小,需要先指定大小//然后View和其内部的子View都具有了实际大小,也就是完成了布局,相当与添加到了界面上。接着就可以创建位图并在上面绘制了:
private void layoutView(View v) {
DisplayMetrics metric = new DisplayMetrics();
getWindowManager().getDefaultDisplay().getMetrics(metric);
int width = metric.widthPixels; // 屏幕宽度(像素)
int height = metric.heightPixels; // 屏幕高度(像素)
// 指定整个View的大小 参数是左上角 和右下角的坐标
v.layout(0, 0, width, height);
int measuredWidth = View.MeasureSpec.makeMeasureSpec(width, View.MeasureSpec.UNSPECIFIED);
int measuredHeight = View.MeasureSpec.makeMeasureSpec(height, View.MeasureSpec.UNSPECIFIED);
/** 当然,measure完后,并不会实际改变View的尺寸,需要调用View.layout方法去进行布局。
* 按示例调用layout函数后,View的大小将会变成你想要设置成的大小。
*/
v.measure(measuredWidth, measuredHeight);
v.layout(0, 0, v.getMeasuredWidth(), v.getMeasuredHeight());
}
其中MeasureSpec简析
MeasureSpec类封装了父布局传递给子布局的布局要求,每个MeasureSpec代表了一组宽
度和高度的要求。,MeasureSpec有三种布局控制模式: