Android笔记:将布局转换成图片

简介: Android笔记:将布局转换成图片

如题,需求就是把xml里面的布局转换成图片,然后保存下来,大家觉得特别简单吧,去问过好多人,也查了查很多app都有这么一个功能,当用户完成了app的某个任务时,产品希望用户点击分享的时候,能动态绘制出一张图片,让用户的分享的内容更加生动化

思路不复杂,可是实践起来简直太多坑了。

1:获取布局


relativeLayout = (RelativeLayout) findViewById(R.id.layout_rl);

2:设置布局相关设置


// 获取图片某布局

relativeLayout.setDrawingCacheEnabled(true);

relativeLayout.buildDrawingCache();

3.获取图片


final Bitmap bmp = relativeLayout.getDrawingCache(); // 获取图片

savePicture(bmp, "test.jpg");// 保存图片

4:保存图片


public void savePicture(Bitmap bm, String fileName) {
    Log.i("xing", "savePicture: ------------------------");
    if (null == bm) {
      Log.i("xing", "savePicture: ------------------图片为空------");
      return;
    }
    File foder = new File(Environment.getExternalStorageDirectory().getAbsolutePath() + "/test");
    if (!foder.exists()) {
      foder.mkdirs();
    }
    File myCaptureFile = new File(foder, fileName);
    try {
      if (!myCaptureFile.exists()) {
        myCaptureFile.createNewFile();
      }
      BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(myCaptureFile));
      //压缩保存到本地
      bm.compress(Bitmap.CompressFormat.JPEG, 90, bos);
      bos.flush();
      bos.close();
    } catch (IOException e) {
      e.printStackTrace();
    }
    Toast.makeText(this, "保存成功!", Toast.LENGTH_SHORT).show();
  }

5:释放资源


relativeLayout.destroyDrawingCache();

View.getDrawingCache() 只适用于分享的View已经完整展示在用户的屏幕上,还有种情况是需要转化为bitmap的布局没有显示,而需要我们在后台生成btmap,我们只


         

需要获取到屏幕的宽高在view生成图片的时候传进去即可,否则会报空指针的


WindowManager manager = this.getWindowManager();

DisplayMetrics outMetrics = new DisplayMetrics();

manager.getDefaultDisplay().getMetrics(outMetrics);

int width = outMetrics.widthPixels;

int height = outMetrics.heightPixels;

假设我当前是在A页面,我要分享出去的B图片和A页面只需要隐藏分享按钮,接下来提供第二种方法,这种方法的做法是:


Bitmap b = Bitmap.createBitmap( v.getLayoutParams().width, v.getLayoutParams().height, Bitmap.Config.ARGB_8888);

Canvas c = new   Canvas(b);

v.layout(v.getLeft(), v.getTop(), v.getRight(), v.getBottom());

v.draw(c);

return b;

这里提供一下核心的代码:

/** 
* 创建分享的图片文件 
*/
public String createShareFile() {    
    Bitmap bitmap = createBitmap();
    //将生成的Bitmap插入到手机的图片库当中,获取到图片路径
    String filePath = MediaStore.Images.Media.insertImage(getContext().getContentResolver(),     bitmap, null, null);    
    //及时回收Bitmap对象,防止OOM
    if (!bitmap.isRecycled()) {        
        bitmap.recycle();    
    } 
    //转uri之前必须判空,防止保存图片失败
    if (TextUtils.isEmpty(filePath)) {        
        return "";    
    }    
    return getRealPathFromURI(getContext(), Uri.parse(filePath));
}
/** 
* 创建分享Bitmap 
*/
private Bitmap createBitmap() {  
    //自定义ViewGroup,一定要手动调用测量,布局的方法  
    measure(getLayoutParams().width, getLayoutParams().height);    
    layout(0, 0, getMeasuredWidth(), getMeasuredHeight());
    //如果图片对透明度无要求,可以设置为RGB_565
    Bitmap bitmap = Bitmap.createBitmap(getWidth(), getHeight(), Bitmap.Config.ARGB_8888);    
    Canvas canvas = new Canvas(bitmap);    
    draw(canvas);   
    return bitmap;
}
private static String getRealPathFromURI(Context context, Uri contentUri) {
    Cursor cursor = null;    
    try {        
        String[] proj = {MediaStore.Images.Media.DATA};        
        cursor = context.getContentResolver().query(contentUri, proj, null, null, null);       
         if (cursor == null) {            
            return "";        
          }        
         int column_index = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
        cursor.moveToFirst();        
        return cursor.getString(column_index);    
    } finally {        
        if (cursor != null) {            
            cursor.close();       
        }    
   }
}

在文章的结尾提醒大家一下网络图片需要加载完成后再回调生成图片成功的方法,例如在Glide的RequestListener等。

马上就要过年了,在这里住大家新年快乐!以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。

目录
相关文章
|
2月前
|
ARouter Android开发
Android不同module布局文件重名被覆盖
Android不同module布局文件重名被覆盖
|
4月前
|
移动开发 监控 前端开发
构建高效Android应用:从优化布局到提升性能
【7月更文挑战第60天】在移动开发领域,一个流畅且响应迅速的应用程序是用户留存的关键。针对Android平台,开发者面临的挑战包括多样化的设备兼容性和性能优化。本文将深入探讨如何通过改进布局设计、内存管理和多线程处理来构建高效的Android应用。我们将剖析布局优化的细节,并讨论最新的Android性能提升策略,以帮助开发者创建更快速、更流畅的用户体验。
71 10
|
2月前
|
Web App开发 安全 程序员
FFmpeg开发笔记(五十五)寒冬里的安卓程序员可进阶修炼的几种姿势
多年的互联网寒冬在今年尤为凛冽,坚守安卓开发愈发不易。面对是否转行或学习新技术的迷茫,安卓程序员可从三个方向进阶:1)钻研谷歌新技术,如Kotlin、Flutter、Jetpack等;2)拓展新功能应用,掌握Socket、OpenGL、WebRTC等专业领域技能;3)结合其他行业,如汽车、游戏、安全等,拓宽职业道路。这三个方向各有学习难度和保饭碗指数,助你在安卓开发领域持续成长。
82 1
FFmpeg开发笔记(五十五)寒冬里的安卓程序员可进阶修炼的几种姿势
|
3月前
|
存储 缓存 编解码
Android经典面试题之图片Bitmap怎么做优化
本文介绍了图片相关的内存优化方法,包括分辨率适配、图片压缩与缓存。文中详细讲解了如何根据不同分辨率放置图片资源,避免图片拉伸变形;并通过示例代码展示了使用`BitmapFactory.Options`进行图片压缩的具体步骤。此外,还介绍了Glide等第三方库如何利用LRU算法实现高效图片缓存。
72 20
Android经典面试题之图片Bitmap怎么做优化
|
2月前
|
Linux API 开发工具
FFmpeg开发笔记(五十九)Linux编译ijkplayer的Android平台so库
ijkplayer是由B站研发的移动端播放器,基于FFmpeg 3.4,支持Android和iOS。其源码托管于GitHub,截至2024年9月15日,获得了3.24万星标和0.81万分支,尽管已停止更新6年。本文档介绍了如何在Linux环境下编译ijkplayer的so库,以便在较新的开发环境中使用。首先需安装编译工具并调整/tmp分区大小,接着下载并安装Android SDK和NDK,最后下载ijkplayer源码并编译。详细步骤包括环境准备、工具安装及库编译等。更多FFmpeg开发知识可参考相关书籍。
108 0
FFmpeg开发笔记(五十九)Linux编译ijkplayer的Android平台so库
|
2月前
|
ARouter Android开发
Android不同module布局文件重名被覆盖
Android不同module布局文件重名被覆盖
147 0
|
4月前
|
JavaScript 前端开发 Java
FFmpeg开发笔记(四十七)寒冬下安卓程序员的几个技术转型发展方向
IT寒冬使APP开发门槛提升,安卓程序员需转型。选项包括:深化Android开发,跟进Google新技术如Kotlin、Jetpack、Flutter及Compose;研究Android底层框架,掌握AOSP;转型Java后端开发,学习Spring Boot等框架;拓展大前端技能,掌握JavaScript、Node.js、Vue.js及特定框架如微信小程序、HarmonyOS;或转向C/C++底层开发,通过音视频项目如FFmpeg积累经验。每条路径都有相应的书籍和技术栈推荐,助你顺利过渡。
116 3
FFmpeg开发笔记(四十七)寒冬下安卓程序员的几个技术转型发展方向
|
4月前
|
编解码 Android开发
【Android Studio】使用UI工具绘制,ConstraintLayout 限制性布局,快速上手
本文介绍了Android Studio中使用ConstraintLayout布局的方法,通过创建布局文件、设置控件约束等步骤,快速上手UI设计,并提供了一个TV Launcher界面布局的绘制示例。
67 1
|
4月前
|
数据处理 开发工具 数据安全/隐私保护
Android平台RTMP推送|轻量级RTSP服务|GB28181接入之文字、png图片水印的精进之路
本文探讨了Android平台上推流模块中添加文字与PNG水印的技术演进。自2015年起,为了满足应急指挥及安防领域的需求,逐步发展出三代水印技术:第一代为静态文字与图像水印;第二代实现了动态更新水印内容的能力,例如实时位置与时间信息;至第三代,则优化了数据传输效率,直接使用Bitmap对象传递水印数据至JNI层,减少了内存拷贝次数。这些迭代不仅提升了用户体验和技术效率,也体现了开发者追求极致与不断创新的精神。
|
4月前
|
自然语言处理 定位技术 API
Android经典实战之如何获取图片的经纬度以及如何根据经纬度获取对应的地点名称
本文介绍如何在Android中从图片提取地理位置信息并转换为地址。首先利用`ExifInterface`获取图片内的经纬度,然后通过`Geocoder`将经纬度转为地址。注意操作需在子线程进行且考虑多语言支持。
267 4