博客
关于我
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/

你可能感兴趣的文章
Linux下的系统监控与性能调优:从入门到精通
查看>>
LiveGBS user/save 逻辑缺陷漏洞复现(CNVD-2023-72138)
查看>>
localhost:5000在MacOS V12(蒙特利)中不可用
查看>>
logstash mysql 准实时同步到 elasticsearch
查看>>
Luogu2973:[USACO10HOL]赶小猪
查看>>
mabatis 中出现< 以及> 代表什么意思?
查看>>
Mac book pro打开docker出现The data couldn’t be read because it is missing
查看>>
MAC M1大数据0-1成神篇-25 hadoop高可用搭建
查看>>
mac mysql 进程_Mac平台下启动MySQL到完全终止MySQL----终端八步走
查看>>
Mac OS 12.0.1 如何安装柯美287打印机驱动,刷卡打印
查看>>
MangoDB4.0版本的安装与配置
查看>>
Manjaro 24.1 “Xahea” 发布!具有 KDE Plasma 6.1.5、GNOME 46 和最新的内核增强功能
查看>>
mapping文件目录生成修改
查看>>
MapReduce程序依赖的jar包
查看>>
mariadb multi-source replication(mariadb多主复制)
查看>>
MariaDB的简单使用
查看>>
MaterialForm对tab页进行隐藏
查看>>
Member var and Static var.
查看>>
memcached高速缓存学习笔记001---memcached介绍和安装以及基本使用
查看>>
memcached高速缓存学习笔记003---利用JAVA程序操作memcached crud操作
查看>>