# android view 转 Bitmap
## 项目中经常将view 转成bitmap然后去分享,一般将View转换成Bitmap分两种情况处理
1.将屏幕上可见的View转换成Bitmap。
2.将不可见的view 转成bitmap ,这种view是没有直接显示在界面上的,需要我们使用inflate 进行创建的view。
### View组件显示的内容可以通过cache机制保存为bitmap, 使用到的api有
- 使用到的api有
void setDrawingCacheEnabled(boolean flag),
Bitmap getDrawingCache(boolean autoScale),
void buildDrawingCache(boolean autoScale),
void destroyDrawingCache()
我们要获取它的cache先要通过setDrawingCacheEnable方法把cache开启,然后再调用getDrawingCache方法就可 以获得view的cache图片了。buildDrawingCache方法可以不用调用,因为调用getDrawingCache方法时,若果 cache没有建立,系统会自动调用buildDrawingCache方法生成cache。若果要更新cache, 必须要调用destoryDrawingCache方法把旧的cache销毁,才能建立新的。
当调用setDrawingCacheEnabled方法设置为false, 系统也会自动把原来的cache销毁
- ViewGroup在绘制子view时,而外提供了两个方法
void setChildrenDrawingCacheEnabled(boolean enabled)
setChildrenDrawnWithCacheEnabled(boolean enabled)
setChildrenDrawingCacheEnabled方法可以使viewgroup里所有的子view开启cache,
setChildrenDrawnWithCacheEnabled使在绘制子view时,若该子view开启了cache, 则使用它的cache进行绘制,从而节省绘制时间。
获取cache通常会占用一定的内存,所以通常不需要的时候有必要对其进行清理,通过destroyDrawingCache或setDrawingCacheEnabled(false)实现。
- 例如:
```
private Bitmap createBitmap(View view) {
view.setDrawingCacheEnabled(true);
view.buildDrawingCache(); //启用DrawingCache并创建位图
Bitmap bitmap = Bitmap.createBitmap(view.getDrawingCache()); //创建一个DrawingCache的拷贝,因为DrawingCache得到的位图在禁用后会被回收
view.setDrawingCacheEnabled(false); //禁用DrawingCahce否则会影响性能
return bitmap;
}
````
这个方法适用于view 已经显示在界面上了,可以获得view 的宽高实际大小,进而通过DrawingCache 保存为bitmap。
### View.draw方法进行绘制
- 对于通过ScrollView ListView等滑动加载的视图,在屏幕上完全显示,但超过一屏的视图
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);
c.drawColor(Color.WHITE);
/** 如果不设置canvas画布为白色,则生成透明 */
v.layout(0, 0, w, h);
v.draw(c);
return bmp;
}
### 通过inflate加载的View
通过inflate加载的视图,通过DrawingCache拿不到bitmap,通过draw拿不到宽度和高度,所以要先通过measure、layout 去获得view 的实际尺寸,然后通过View.draw方法进行绘制
-先获取屏幕的宽高 当然用户也可以指定截图的宽度和高度
protected void onCreate(Bundle savedInstanceState) {
DisplayMetrics metric = new DisplayMetrics();
getWindowManager().getDefaultDisplay().getMetrics(metric);
int width = metric.widthPixels; // 屏幕宽度(像素)
int height = metric.heightPixels; // 屏幕高度(像素)
View view = LayoutInflater.from(this).inflate(R.layout.view_photo, null, false);
Bitmap bitmap = createBitmap(view,width,height);
}
- 根据宽高去获取图片
public Bitmap createBitmap(View v, int width, int height) {
//测量使得view指定大小
int measuredWidth = View.MeasureSpec.makeMeasureSpec(width, View.MeasureSpec.EXACTLY);
int measuredHeight = View.MeasureSpec.makeMeasureSpec(height, View.MeasureSpec.EXACTLY);
v.measure(measuredWidth, measuredHeight);
//调用layout方法布局后,可以得到view的尺寸大小
v.layout(0, 0, v.getMeasuredWidth(), v.getMeasuredHeight());
Bitmap bmp = Bitmap.createBitmap(v.getWidth(), v.getHeight(), Bitmap.Config.ARGB_8888);
Canvas c = new Canvas(bmp);
c.drawColor(Color.WHITE);
v.draw(c);
return bmp;
}
### 将Bitmap转换成分享的文件
public class FileUtil {
private static String sharePickNmae = "share.jpg";
public File getShareExtraPath(){
if (!Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)){
return null;
}
String sharePicPath = Environment.getExternalStorageDirectory().getAbsolutePath()
+ File.separator+"shares"+File.separator+"shareIpcs"+File.separator;
File file = new File(sharePicPath);
if (file.exists()){
return file;
}
file.mkdirs();
return file;
}
/*
*注意在6.0之上要动态申请权限
*/
public File saveSharePic(Context context, Bitmap bitmap){
File rootFile = getShareExtraPath();
File filePic = new File(rootFile,sharePickNmae);
if (filePic.exists()){
filePic.delete();
}
try {
FileOutputStream out = new FileOutputStream(filePic);
if (bitmap == null){
bitmap = BitmapFactory.decodeResource(context.getResources(), R.drawable.ic_launcher_background);
}
bitmap.compress(Bitmap.CompressFormat.PNG,90,out);
out.flush();
out.close();
} catch (IOException e) {
e.printStackTrace();
}
return filePic;
}
android view 转 Bitmap
最新推荐文章于 2024-06-16 13:16:31 发布