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

转载 2014年03月12日 14:35:20
将view映射到一个bitmap中,稍加改进可以用于一些截图工具或者截图软件(QQ截图之类),例子写的不够完善,不过很有些学习的意义内容大致如下:

在Android中自有获取view中的cache内容,然后将内容转换成bitmap,方法名是:getDrawingCache(),返回结果为Bitmap。
在使用的时候调用

Bitmap bitmap = view.getDrawingCache();

就可以得到图片的bitmap了。

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

[/img]
布局文件:
main.xml
Java代码 复制代码 收藏代码
  1. <?xml version="1.0" encoding="utf-8"?>   
  2. <LinearLayout   
  3.     xmlns:android="http://schemas.android.com/apk/res/android"  
  4.     android:orientation="vertical"  
  5.     android:layout_width="fill_parent"  
  6.     android:layout_height="fill_parent">   
  7.     <Button   
  8.         android:id="@+id/setview"  
  9.         android:layout_width="fill_parent"  
  10.         android:layout_height="wrap_content"  
  11.         android:text="SET_VIEW" />   
  12.     <Button   
  13.         android:id="@+id/addview"  
  14.         android:layout_width="fill_parent"  
  15.         android:layout_height="wrap_content"  
  16.         android:text="ADD_VIEW" />   
  17. </LinearLayout>  


add_view.xml
Java代码 复制代码 收藏代码
  1. <?xml version="1.0" encoding="utf-8"?>   
  2. <LinearLayout   
  3.     xmlns:android="http://schemas.android.com/apk/res/android"  
  4.     android:orientation="vertical"  
  5.     android:layout_width="fill_parent"  
  6.     android:layout_height="fill_parent">   
  7.     <TextView   
  8.         android:text="add_view"  
  9.         android:layout_width="fill_parent"  
  10.         android:layout_height="wrap_content" />   
  11.     <LinearLayout   
  12.         android:id="@+id/addViewContent"  
  13.         android:orientation="vertical"  
  14.         android:layout_width="fill_parent"  
  15.         android:layout_height="wrap_content" />   
  16.   
  17.   
  18.     <LinearLayout   
  19.         android:id="@+id/addViewCache"  
  20.         android:layout_width="wrap_content"  
  21.         android:layout_height="wrap_content">   
  22.         <ImageView   
  23.             android:id="@+id/imgAddViewCache"  
  24.             android:layout_width="fill_parent"  
  25.             android:layout_height="wrap_content" />   
  26.   
  27.     </LinearLayout>   
  28.   
  29. </LinearLayout>  


set_view.xml
Java代码 复制代码 收藏代码
  1. <?xml version="1.0" encoding="utf-8"?>   
  2. <LinearLayout   
  3.     xmlns:android="http://schemas.android.com/apk/res/android"  
  4.     android:orientation="vertical"  
  5.     android:layout_width="fill_parent"  
  6.     android:layout_height="fill_parent">   
  7.     <TextView   
  8.         android:text="set_view"  
  9.         android:layout_width="fill_parent"  
  10.         android:layout_height="wrap_content" />   
  11.     <LinearLayout   
  12.         android:id="@+id/content"  
  13.         android:orientation="vertical"  
  14.         android:layout_width="wrap_content"  
  15.         android:layout_height="wrap_content">   
  16.         <ImageView   
  17.             android:id="@+id/imgSource1"  
  18.             android:layout_width="wrap_content"  
  19.             android:layout_height="wrap_content" />   
  20.         <ImageView   
  21.             android:id="@+id/imgSource2"  
  22.             android:layout_width="wrap_content"  
  23.             android:layout_height="wrap_content" />   
  24.     </LinearLayout>   
  25.   
  26.     <LinearLayout   
  27.         android:id="@+id/cache"  
  28.         android:layout_width="wrap_content"  
  29.         android:layout_height="wrap_content">   
  30.         <ImageView   
  31.             android:id="@+id/imgCache"  
  32.             android:layout_width="wrap_content"  
  33.             android:layout_height="wrap_content" />   
  34.   
  35.     </LinearLayout>   
  36. </LinearLayout>  


AddViewActivity
Java代码 复制代码 收藏代码
  1. package com.zart;   
  2.   
  3. import android.app.Activity;   
  4. import android.graphics.Bitmap;   
  5. import android.os.Bundle;   
  6. import android.util.Log;   
  7. import android.view.View.MeasureSpec;   
  8. import android.view.ViewGroup.LayoutParams;   
  9. import android.widget.ImageView;   
  10. import android.widget.LinearLayout;   
  11. import android.widget.RelativeLayout;   
  12.   
  13. public class AddViewActivity extends Activity {   
  14.   
  15.     private LinearLayout addViewContent;   
  16.     private ImageView imgAddViewCache;   
  17.   
  18.     @Override  
  19.     protected void onCreate(Bundle savedInstanceState) {   
  20.         // TODO Auto-generated method stub   
  21.         super.onCreate(savedInstanceState);   
  22.         setContentView(R.layout.add_view);   
  23.         addViewContent = (LinearLayout) findViewById(R.id.addViewContent);   
  24.         imgAddViewCache = (ImageView) findViewById(R.id.imgAddViewCache);   
  25.         // addImgSource();   
  26.         addRelativeLayout();   
  27.   
  28.         addViewContent.setDrawingCacheEnabled(true);   
  29.         addViewContent.measure(MeasureSpec.makeMeasureSpec(0,   
  30.                 MeasureSpec.UNSPECIFIED), MeasureSpec.makeMeasureSpec(0,   
  31.                 MeasureSpec.UNSPECIFIED));   
  32.         addViewContent.layout(00, addViewContent.getMeasuredWidth(),   
  33.                 addViewContent.getMeasuredHeight());   
  34.   
  35.         addViewContent.buildDrawingCache();   
  36.         int color = addViewContent.getDrawingCacheBackgroundColor();   
  37.   
  38.         Bitmap cacheBitmap = addViewContent.getDrawingCache();   
  39.         Bitmap bitmap = Bitmap.createBitmap(cacheBitmap);// 注意:这地方必须特别注意   
  40.         if (bitmap != null) {   
  41.             imgAddViewCache.setImageBitmap(bitmap);   
  42.             imgAddViewCache.setDrawingCacheBackgroundColor(color);   
  43.         } else {   
  44.             Log.i("CACHE_BITMAP""DrawingCache=null");   
  45.         }   
  46.     }   
  47.   
  48.     private void addRelativeLayout() {   
  49.         // TODO Auto-generated method stub   
  50.         RelativeLayout.LayoutParams layoutpare = new RelativeLayout.LayoutParams(   
  51.                 LayoutParams.FILL_PARENT, LayoutParams.WRAP_CONTENT);   
  52.   
  53.         RelativeLayout relativeLayout = new RelativeLayout(this);   
  54.         relativeLayout.setLayoutParams(layoutpare);   
  55.   
  56.         ImageView imgView1 = new ImageView(this);   
  57.         ImageView imgView2 = new ImageView(this);   
  58.         imgView1.setImageResource(R.drawable.source1);   
  59.         imgView2.setImageResource(R.drawable.source2);   
  60.         RelativeLayout.LayoutParams img1 = new RelativeLayout.LayoutParams(38,   
  61.                 38);   
  62.         img1.addRule(RelativeLayout.ALIGN_PARENT_LEFT, RelativeLayout.TRUE);   
  63.         RelativeLayout.LayoutParams img2 = new RelativeLayout.LayoutParams(38,   
  64.                 38);   
  65.         img2.addRule(RelativeLayout.ALIGN_PARENT_RIGHT, RelativeLayout.TRUE);   
  66.   
  67.         relativeLayout.addView(imgView1, img1);   
  68.         relativeLayout.addView(imgView2, img2);   
  69.         addViewContent.addView(relativeLayout);   
  70.     }   
  71.   
  72.     /**  
  73.      * 添加图片源  
  74.      */  
  75.     private void addImgSource() {   
  76.         ImageView imgView1 = new ImageView(this);   
  77.         ImageView imgView2 = new ImageView(this);   
  78.         imgView1.setImageResource(R.drawable.source1);   
  79.         imgView2.setImageResource(R.drawable.source2);   
  80.         addViewContent.addView(imgView1, new LayoutParams(   
  81.                 LinearLayout.LayoutParams.WRAP_CONTENT,   
  82.                 LinearLayout.LayoutParams.WRAP_CONTENT));   
  83.         addViewContent.addView(imgView2, new LayoutParams(   
  84.                 LinearLayout.LayoutParams.WRAP_CONTENT,   
  85.                 LinearLayout.LayoutParams.WRAP_CONTENT));   
  86.     }   
  87.   
  88. }  


MainActivity
Java代码 复制代码 收藏代码
  1. package com.zart;   
  2.   
  3. import android.app.Activity;   
  4. import android.content.Intent;   
  5. import android.os.Bundle;   
  6. import android.view.View;   
  7. import android.view.View.OnClickListener;   
  8. import android.widget.Button;   
  9.   
  10. public class MainActivity extends Activity implements OnClickListener {   
  11.   
  12.     private Button btn_setView;   
  13.     private Button btn_addView;   
  14.        
  15.     @Override  
  16.     protected void onCreate(Bundle savedInstanceState) {   
  17.         // TODO Auto-generated method stub   
  18.         super.onCreate(savedInstanceState);   
  19.         setContentView(R.layout.main);   
  20.         btn_setView = (Button) findViewById(R.id.setview);   
  21.         btn_addView = (Button) findViewById(R.id.addview);   
  22.         btn_setView.setOnClickListener(this);   
  23.         btn_addView.setOnClickListener(this);   
  24.     }   
  25.        
  26.     @Override  
  27.     public void onClick(View view) {   
  28.         // TODO Auto-generated method stub   
  29.         switch (view.getId()) {   
  30.         case R.id.setview:   
  31.             Intent intent1 = new Intent();   
  32.             intent1.setClass(this, SetViewActivity.class);   
  33.             startActivity(intent1);   
  34.             break;   
  35.         case R.id.addview:   
  36.             Intent intent2 = new Intent();   
  37.             intent2.setClass(this, AddViewActivity.class);   
  38.             startActivity(intent2);   
  39.             break;   
  40.         default:   
  41.             break;   
  42.         }   
  43.            
  44.   
  45.     }   
  46.   
  47.   
  48. }  


SetViewActivity
Java代码 复制代码 收藏代码
  1. package com.zart;   
  2.   
  3. import android.app.Activity;   
  4. import android.graphics.Bitmap;   
  5. import android.os.Bundle;   
  6. import android.util.Log;   
  7. import android.view.View.MeasureSpec;   
  8. import android.widget.ImageView;   
  9. import android.widget.LinearLayout;   
  10.   
  11. public class SetViewActivity extends Activity {   
  12.     /** Called when the activity is first created. */  
  13.     private LinearLayout contentLayout;   
  14.     private ImageView imgSource1;   
  15.     private ImageView imgSource2;   
  16.     private ImageView imgCache;   
  17.   
  18.     @Override  
  19.     public void onCreate(Bundle savedInstanceState) {   
  20.         super.onCreate(savedInstanceState);   
  21.         setContentView(R.layout.set_view);   
  22.         contentLayout = (LinearLayout) findViewById(R.id.content);   
  23.         imgSource1 = (ImageView) findViewById(R.id.imgSource1);   
  24.         imgSource2 = (ImageView) findViewById(R.id.imgSource2);   
  25.         imgCache = (ImageView) findViewById(R.id.imgCache);   
  26.   
  27.         imgSource1.setImageResource(R.drawable.source1);   
  28.         imgSource2.setImageResource(R.drawable.source2);   
  29.            
  30.         contentLayout.setDrawingCacheEnabled(true);   
  31.         contentLayout.measure(   
  32.                 MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED),   
  33.                 MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED));   
  34.         contentLayout.layout(00, contentLayout.getMeasuredWidth(),   
  35.                 contentLayout.getMeasuredHeight());   
  36.   
  37.         contentLayout.buildDrawingCache();   
  38.            
  39.         Bitmap bitmap= contentLayout.getDrawingCache();   
  40.         if(bitmap!=null){   
  41.             imgCache.setImageBitmap(bitmap);   
  42.         }else{   
  43.             Log.i("CACHE_BITMAP""DrawingCache=null");   
  44.         }   
  45.     }   
  46. }  


转自:http://hddev.blog.51cto.com/3365350/629808

android将LinearLayout中的内容保存为Bitmap。

前几天,和别人探讨问题的时候,突然了解到还有这个功能。 现在闲了,纪录下来,方便大家调用。 public Bitmap createViewBitmap(View v) { Bitmap bi...
  • u011368551
  • u011368551
  • 2015-08-04 09:40:23
  • 2146

android开发之Glide加载RelativeLayout背景图

Glide框架大家应该都很熟悉,我们可以使用Glide加载网络图片、加载gif图片,使用简单。一般情况下我们都是使用Glide加载图片到ImageView上,那么如何加载到RelativeLayout...
  • SheaJIn
  • SheaJIn
  • 2017-06-20 15:32:44
  • 4190

关于View转化成bitmap保存成图片

产品今天说项目分享时要分享出一张  封面图片 + 几行文字 + 二维码图片 的图片。 思索了一下 封面图片和二维码图片让后台给接口得到地址, 主要还是找个方式得到一个包含这些内容的图片。于是就想能不...
  • a450479378
  • a450479378
  • 2016-11-08 14:24:52
  • 5497

android获得布局的Bitmap对象

android  保存界面可视化组件,在调用View.getDrawingCache方法前需要调用measure和layout方法才能可以成功获取布局的Bitmap对象 代码如下: //获得x...
  • qqq01002013019
  • qqq01002013019
  • 2015-05-28 16:39:37
  • 774

android生成分享长图并且添加全图水印

长图一般是ScrollView和ListView。 我们需要取得这两个控件的完整显示的图片。原理很简单,搞一张和控件长宽一致的画布(就是创建一个高宽相等的bitmap)。然后调用控件的draw方法把自...
  • gengqiquan
  • gengqiquan
  • 2017-03-25 17:05:17
  • 6755

android后台通过View生成分享图片

原文地址:http://www.jianshu.com/p/33e30da0385c 最近工作特忙,好久没静下心总结一些开发中的心得,后面会陆续写一些文章总结一下最近遇到的问题和一些收获吧~...
  • superbigcupid
  • superbigcupid
  • 2017-06-20 16:43:57
  • 1134

Android View转换成图片保存

package zhangphil.viewtoimage; import java.io.File; import java.io.FileOutputStream; import androi...
  • zhangphil
  • zhangphil
  • 2015-03-12 09:37:18
  • 7544

Android中将View的内容保存为图像的方法

原理:创建一个新的Bitmap,然后再根据它来创建一个Canvas,最后调用View的draw方法将View画到Canvas上,这样得到的Bitmap就是我们想要的。代码: public Bit...
  • singwhatiwanna
  • singwhatiwanna
  • 2014-01-23 10:16:03
  • 7617

Android 合并生成分享图片(View截图)

用以前以前写过的自定义课表软件 ,Android 自定义View课程表表格 原生View截图合成分享的图片 看到的是图片只显示到11节处,下面的没有...
  • shallcheek
  • shallcheek
  • 2015-07-22 09:52:27
  • 5609

Android 将布局文件转成图片(将View 转换成BitMap)

将View 转换成BitMap的方法,   这样可以解决自定义图片的问题了      /**     * 把一个view转化成bitmap对象     * */    public  ...
  • a872822645
  • a872822645
  • 2016-04-19 16:15:43
  • 1928
收藏助手
不良信息举报
您举报文章:将View的内容映射成Bitmap转图片导出
举报原因:
原因补充:

(最多只允许输入30个字)