android view 转 Bitmap

# 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;
            }
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值