将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

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

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

把View转化成Bitmap的方法

方法一: /** * 把View绘制到Bitmap上 * @param view 需要绘制的View * @param width 该View的宽度 * @param height 该Vie...
  • chenshijun0101
  • chenshijun0101
  • 2014年07月21日 19:30
  • 15558

android将 View转为Bitmap图片

public static Bitmap convertViewToBitmap(View view) { view.destroyDrawingCache(); view.measu...
  • jdsjlzx
  • jdsjlzx
  • 2016年05月06日 10:15
  • 2572

Android中view转换为bitmap为null解决方案

前言我们经常会用到将一个View转换为Bitmap的情景,比如截屏保存到本地,比如一些动态的实时View为便于观察和记录数据、需要临时生成静态的Bitmap等等。 我们一般都会这样写:public ...
  • aiynmimi
  • aiynmimi
  • 2017年01月19日 19:01
  • 1722

将一个view对象转换为bitmap对象

private Bitmap getViewBitmap(View addViewContent) {         addViewContent.setDrawingCacheEnabled...
  • xc605098599
  • xc605098599
  • 2016年04月20日 12:05
  • 871

android自定义view,不显示view情况下,把view转为bitmap

android里有很好的布局文件,可以省去onDraw算每个坐标点,所以可以用自定义控件绘制想要的图片,以下代码供参考 //自定义控件 CirleGroupImgView he...
  • wuchao5555
  • wuchao5555
  • 2015年07月30日 15:24
  • 1256

Android 将View 转化为bitmap 图片

原理 将view利用canvas画到bitmap 上,然后对bitmap进行后续的操作可以保存为png或者jpeg,我想要进行灰度处理但是没有去实现。 package com.garea.plugi...
  • a772890398
  • a772890398
  • 2016年07月07日 18:39
  • 507

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

将View 转换成BitMap的方法,   这样可以解决自定义图片的问题了      /**     * 把一个view转化成bitmap对象     * */    public  ...
  • a872822645
  • a872822645
  • 2016年04月19日 16:15
  • 1378

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

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

Android,布局(layout)转化成bitmap,再生成文件

Android,布局(layout)转化成bitmap,再生成文件。
  • qq_16247851
  • qq_16247851
  • 2017年05月26日 17:52
  • 1187
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:将View的内容映射成Bitmap转图片导出
举报原因:
原因补充:

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