博客
关于我
Android 布局文件(view)生成Bitmap
阅读量:132 次
发布时间:2019-02-27

本文共 3024 字,大约阅读时间需要 10 分钟。

已测量过的View生成Bitmap

         即经过测量、布局、绘制并显示在界面上的View,此类View无需再次进行测量和布局,可直接将内容绘制到指定的Bitmap上。

/** * 绘制已经测量过的View */private static Bitmap drawMeasureView(View view) {    int width = view.getWidth();    int height = view.getHeight();    Bitmap bitmap = Bitmap.createBitmap(width, height, Bitmap.Config.RGB_565);    Canvas canvas = new Canvas(bitmap);    view.draw(canvas);    return bitmap;}

未测量过的View生成Bitmap

        直接Inflate后并未显示在界面的View,此类View必须手动进行测量和布局后,方可进行绘制,否则获取不到对应的宽高和内容。

/** * 先测量和布局,再生成Bitmap */public static Bitmap getBitmap(View view) {    DisplayMetrics metric = new DisplayMetrics();    getWindowManager().getDefaultDisplay().getMetrics(metric);    int screenWidth= metric.widthPixels;     // 屏幕宽度(像素)    int screenHeight = metric.heightPixels;   // 屏幕高度(像素)    // 测量    int widthSpec = View.MeasureSpec.makeMeasureSpec(screenWidth, View.MeasureSpec.AT_MOST);    int heightSpec = View.MeasureSpec.makeMeasureSpec(screenHeight, View.MeasureSpec.AT_MOST);    view.measure(widthSpec, heightSpec);    // 布局    int measuredWidth = view.getMeasuredWidth();    int measuredHeight = view.getMeasuredHeight();    view.layout(0, 0, measuredWidth, measuredHeight);    // 绘制    int width = view.getWidth();    int height = view.getHeight();    Bitmap bitmap = Bitmap.createBitmap(width, height, Bitmap.Config.RGB_565);    Canvas canvas = new Canvas(bitmap);    view.draw(canvas);    return bitmap;}

更新、填充布局中view的内容显示

public void layoutView(final View viewBitmap,  String url, Activity activity) {    final ImageView imageView = viewBitmap.findViewById(R.id.iv_show);    //注意加载网络图片时一定要用SimpleTarget回调    Glide.with(activity).asBitmap().load(url).into(new SimpleTarget
() { @Override public void onResourceReady(@NonNull Bitmap resource, @Nullable Transition
transition) { //图片加载完毕回调,可以在这里完成整个页面bitmap的转换 imageView.setImageBitmap(resource); Bitmap bitmap = getBitmap(viewBitmap); //保存到本地 savePhotoToSDCard(bitmap ); } });}

保存到本地(切记在清单文件里面增加sd卡的相关权限、动态申请等操作)

public static void savePhotoToSDCard(Bitmap photoBitmap) {        FileOutputStream fos;        String imagePath = "";        try {            // 判断手机设备是否有SD卡            boolean isHasSDCard = Environment.getExternalStorageState().equals(                    android.os.Environment.MEDIA_MOUNTED);            if (isHasSDCard) {                // SD卡根目录                File sdRoot = Environment.getExternalStorageDirectory();                File file = new File(sdRoot, Calendar.getInstance().getTimeInMillis()+".png");                fos = new FileOutputStream(file);                imagePath = file.getAbsolutePath();            } else{                throw new Exception("创建文件失败!");            }            cachebmp.compress(Bitmap.CompressFormat.PNG, 90, fos);            fos.flush();            fos.close();        } catch (Exception e) {            e.printStackTrace();        }    }

其实里面的坑有好多,也是参考了好几篇文章,才解决了这个需求,谢谢以下的文章作者,同时也给大家一个参考。

(动态改变布局中的imageview的图片)
 

转载地址:http://wxub.baihongyu.com/

你可能感兴趣的文章
nginx配置详解、端口重定向和504
查看>>
Nginx配置负载均衡到后台网关集群
查看>>
Nginx配置限流,技能拉满!
查看>>
Nginx配置静态代理/静态资源映射时root与alias的区别,带前缀映射用alias
查看>>
Nginx面试三连问:Nginx如何工作?负载均衡策略有哪些?如何限流?
查看>>
nginx:/usr/src/fastdfs-nginx-module/src/common.c:21:25:致命错误:fdfs_define.h:没有那个文件或目录 #include
查看>>
Nginx:NginxConfig可视化配置工具安装
查看>>
ngModelController
查看>>
ngrok | 内网穿透,支持 HTTPS、国内访问、静态域名
查看>>
ngrok内网穿透可以实现资源共享吗?快解析更加简洁
查看>>
ngrok内网穿透可以实现资源共享吗?快解析更加简洁
查看>>
NHibernate学习[1]
查看>>
NHibernate异常:No persister for的解决办法
查看>>
Nhibernate的第一个实例
查看>>
nid修改oracle11gR2数据库名
查看>>
NIFI1.21.0/NIFI1.22.0/NIFI1.24.0/NIFI1.26.0_2024-06-11最新版本安装_采用HTTP方式_搭建集群_实际操作---大数据之Nifi工作笔记0050
查看>>
NIFI1.21.0_java.net.SocketException:_Too many open files 打开的文件太多_实际操作---大数据之Nifi工作笔记0051
查看>>
NIFI1.21.0_Mysql到Mysql增量CDC同步中_日期类型_以及null数据同步处理补充---大数据之Nifi工作笔记0057
查看>>
NIFI1.21.0_Mysql到Mysql增量CDC同步中_补充_插入时如果目标表中已存在该数据则自动改为更新数据_Postgresql_Hbase也适用---大数据之Nifi工作笔记0058
查看>>
NIFI1.21.0_Mysql到Mysql增量CDC同步中_补充_更新时如果目标表中不存在记录就改为插入数据_Postgresql_Hbase也适用---大数据之Nifi工作笔记0059
查看>>