Android:将View的内容映射成Bitmap转图片导出

简介:

前段时间在网上看到这么个例子是将view映射到一个bitmap中,稍加改进可以用于一些截图工具或者截图软件(QQ截图之类),例子写的不够完善,不过很有些学习的意义内容大致如下:

在Android中自有获取view中的cache内容,然后将内容转换成bitmap,方法名是:getDrawingCache(),返回结果为Bitmap,但是刚开始使用的时候,得到的结果都是null,所以在一个论坛里查到了正确的使用方法.代码如下:

 
  1. contentLayout.setDrawingCacheEnabled(true);     
  2.         contentLayout.measure(     
  3.                MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED),     
  4.                 MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED));     
  5.        contentLayout.layout(00, contentLayout.getMeasuredWidth(),     
  6.                 contentLayout.getMeasuredHeight());     
  7.    
  8.      contentLayout.buildDrawingCache();     
  9.            
  10.       Bitmap bitmap= contentLayout.getDrawingCache();    

在使用的时候调用

Bitmap bitmap = view.getDrawingCache();

就可以得到图片的bitmap了。

为了测试这个功能,作者使用了两种方式来创建LinerLayout中的内容,一种是在xml文件中就将view的内容添加了,只需在代码中添加对应ImageView中的图片就行了;另一种是动态添加LinerLayout中的View。

 

setview的代码:

 
  1. public void onCreate(Bundle savedInstanceState) {     
  2.     super.onCreate(savedInstanceState);     
  3.     setContentView(R.layout.set_view);     
  4.     contentLayout = (LinearLayout) findViewById(R.id.content);     
  5.     imgSource1 = (ImageView) findViewById(R.id.imgSource1);     
  6.     imgSource2 = (ImageView) findViewById(R.id.imgSource2);     
  7.     imgCache = (ImageView) findViewById(R.id.imgCache);     
  8.     
  9.    imgSource1.setImageResource(R.drawable.source1);     
  10.     imgSource2.setImageResource(R.drawable.source2);     
  11.         
  12.     contentLayout.setDrawingCacheEnabled(true);     
  13.     contentLayout.measure(     
  14.             MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED),     
  15.             MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED));     
  16.     contentLayout.layout(00, contentLayout.getMeasuredWidth(),     
  17.             contentLayout.getMeasuredHeight());     
  18.     
  19.     contentLayout.buildDrawingCache();     
  20.          
  21.     Bitmap bitmap= contentLayout.getDrawingCache();     
  22.     if(bitmap!=null){     
  23.         imgCache.setImageBitmap(bitmap);     
  24.     }else{     
  25.         Log.i("CACHE_BITMAP""DrawingCache=null");     
  26.     }     
  27. }    

第二种方法代码:

 

 
  1. private void addRelativeLayout() {     
  2.         // TODO Auto-generated method stub     
  3.         RelativeLayout.LayoutParams layoutpare = new RelativeLayout.LayoutParams(     
  4.                 LayoutParams.FILL_PARENT, LayoutParams.WRAP_CONTENT);     
  5.    
  6.         RelativeLayout relativeLayout = new RelativeLayout(this);     
  7.         relativeLayout.setLayoutParams(layoutpare);     
  8.     
  9.         ImageView imgView1 = new ImageView(this);     
  10.         ImageView imgView2 = new ImageView(this);     
  11.         imgView1.setImageResource(R.drawable.source1);     
  12.         imgView2.setImageResource(R.drawable.source2);     
  13.         RelativeLayout.LayoutParams img1 = new RelativeLayout.LayoutParams(38,     
  14.                 38);     
  15.         img1.addRule(RelativeLayout.ALIGN_PARENT_LEFT, RelativeLayout.TRUE);     
  16.         RelativeLayout.LayoutParams img2 = new RelativeLayout.LayoutParams(38,     
  17.                 38);     
  18.         img2.addRule(RelativeLayout.ALIGN_PARENT_RIGHT, RelativeLayout.TRUE);     
  19.     
  20.         relativeLayout.addView(imgView1, img1);     
  21.         relativeLayout.addView(imgView2, img2);     
  22.         addViewContent.addView(relativeLayout);     
  23.     }     
  24.     
  25.     /**    
  26.      * 添加图片源    
  27.      */    
  28.    private void addImgSource() {     
  29.         ImageView imgView1 = new ImageView(this);     
  30.         ImageView imgView2 = new ImageView(this);     
  31.         imgView1.setImageResource(R.drawable.source1);     
  32.         imgView2.setImageResource(R.drawable.source2);     
  33.         addViewContent.addView(imgView1, new LayoutParams(     
  34.                 LinearLayout.LayoutParams.WRAP_CONTENT,     
  35.                 LinearLayout.LayoutParams.WRAP_CONTENT));     
  36.         addViewContent.addView(imgView2, new LayoutParams(     
  37.                 LinearLayout.LayoutParams.WRAP_CONTENT,     
  38.                 LinearLayout.LayoutParams.WRAP_CONTENT));     
  39.     }    

 本文转自HDDevTeam 51CTO博客,原文链接:http://blog.51cto.com/hddev/629808,如需转载请自行联系原作者

相关文章
|
3天前
|
存储 缓存 编解码
Android经典面试题之图片Bitmap怎么做优化
本文介绍了图片相关的内存优化方法,包括分辨率适配、图片压缩与缓存。文中详细讲解了如何根据不同分辨率放置图片资源,避免图片拉伸变形;并通过示例代码展示了使用`BitmapFactory.Options`进行图片压缩的具体步骤。此外,还介绍了Glide等第三方库如何利用LRU算法实现高效图片缓存。
35 20
Android经典面试题之图片Bitmap怎么做优化
|
6天前
|
缓存 搜索推荐 Android开发
安卓应用开发中的自定义View组件实践
【9月更文挑战第10天】在安卓开发领域,自定义View是提升用户体验和实现界面个性化的重要手段。本文将通过一个实际案例,展示如何在安卓项目中创建和使用自定义View组件,包括设计思路、实现步骤以及可能遇到的问题和解决方案。文章不仅提供了代码示例,还深入探讨了自定义View的性能优化技巧,旨在帮助开发者更好地掌握这一技能。
|
8天前
|
Android开发
Android中SurfaceView的双缓冲机制和普通View叠加问题解决办法
本文介绍了 Android 平台上的 SurfaceView,这是一种高效的图形渲染控件,尤其适用于视频播放、游戏和图形动画等场景。文章详细解释了其双缓冲机制,该机制通过前后缓冲区交换来减少图像闪烁,提升视觉体验。然而,SurfaceView 与普通 View 叠加时可能存在 Z-Order 不一致、同步问题及混合渲染难题。文中提供了使用 TextureView、调整 Z-Order 和创建自定义组合控件等多种解决方案。
39 9
|
12天前
|
Android开发 容器
Android经典实战之如何获取View和ViewGroup的中心点
本文介绍了在Android中如何获取`View`和`ViewGroup`的中心点坐标,包括计算相对坐标和屏幕上的绝对坐标,并提供了示例代码。特别注意在视图未完成测量时可能出现的宽高为0的问题及解决方案。
24 7
|
18天前
|
XML 搜索推荐 Android开发
安卓开发中的自定义View组件实践
【8月更文挑战第30天】探索Android世界,自定义View是提升应用界面的关键。本文以简洁的语言带你了解如何创建自定义View,从基础到高级技巧,一步步打造个性化的UI组件。
|
1月前
|
API Android开发 开发者
Android经典实战之使用ViewCompat来处理View兼容性问题
本文介绍Android中的`ViewCompat`工具类,它是AndroidX库核心部分的重要兼容性组件,确保在不同Android版本间处理视图的一致性。文章列举了设置透明度、旋转、缩放、平移等功能,并提供了背景色、动画及用户交互等实用示例。通过`ViewCompat`,开发者可轻松实现跨版本视图操作,增强应用兼容性。
68 5
|
1月前
|
数据处理 开发工具 数据安全/隐私保护
Android平台RTMP推送|轻量级RTSP服务|GB28181接入之文字、png图片水印的精进之路
本文探讨了Android平台上推流模块中添加文字与PNG水印的技术演进。自2015年起,为了满足应急指挥及安防领域的需求,逐步发展出三代水印技术:第一代为静态文字与图像水印;第二代实现了动态更新水印内容的能力,例如实时位置与时间信息;至第三代,则优化了数据传输效率,直接使用Bitmap对象传递水印数据至JNI层,减少了内存拷贝次数。这些迭代不仅提升了用户体验和技术效率,也体现了开发者追求极致与不断创新的精神。
|
1月前
|
自然语言处理 定位技术 API
Android经典实战之如何获取图片的经纬度以及如何根据经纬度获取对应的地点名称
本文介绍如何在Android中从图片提取地理位置信息并转换为地址。首先利用`ExifInterface`获取图片内的经纬度,然后通过`Geocoder`将经纬度转为地址。注意操作需在子线程进行且考虑多语言支持。
102 4
|
1月前
|
XML 前端开发 Android开发
Android面试高频知识点(3) 详解Android View的绘制流程
View的绘制和事件处理是两个重要的主题,上一篇《图解 Android事件分发机制》已经把事件的分发机制讲得比较详细了,这一篇是针对View的绘制,View的绘制如果你有所了解,基本分为measure、layout、draw 过程,其中比较难理解就是measure过程,所以本篇文章大幅笔地分析measure过程,相对讲得比较详细,文章也比较长,如果你对View的绘制还不是很懂,对measure过程掌握得不是很深刻,那么耐心点,看完这篇文章,相信你会有所收获的。
67 2
|
1月前
|
XML 前端开发 Android开发
Android经典实战之Kotlin中实现圆角图片和圆形图片
本文介绍两种实现圆角图像视图的方法。第一种是通过自定义Kotlin `AppCompatImageView`,重写`onDraw`方法使用`Canvas`和`Path`进行圆角剪裁。第二种利用Android Material库中的`ShapeableImageView`,简单配置即可实现圆角效果。两种方法均易于实现且提供动态调整圆角半径的功能。
29 0