`

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

阅读更多
将view映射到一个bitmap中,稍加改进可以用于一些截图工具或者截图软件(QQ截图之类),例子写的不够完善,不过很有些学习的意义内容大致如下:

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

Bitmap bitmap = view.getDrawingCache();

就可以得到图片的bitmap了。

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

[/img]
布局文件:
main.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
	xmlns:android="http://schemas.android.com/apk/res/android"
	android:orientation="vertical"
	android:layout_width="fill_parent"
	android:layout_height="fill_parent">
	<Button
		android:id="@+id/setview"
		android:layout_width="fill_parent"
		android:layout_height="wrap_content"
		android:text="SET_VIEW" />
	<Button
		android:id="@+id/addview"
		android:layout_width="fill_parent"
		android:layout_height="wrap_content"
		android:text="ADD_VIEW" />
</LinearLayout>


add_view.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
	xmlns:android="http://schemas.android.com/apk/res/android"
	android:orientation="vertical"
	android:layout_width="fill_parent"
	android:layout_height="fill_parent">
	<TextView
		android:text="add_view"
		android:layout_width="fill_parent"
		android:layout_height="wrap_content" />
	<LinearLayout
		android:id="@+id/addViewContent"
		android:orientation="vertical"
		android:layout_width="fill_parent"
		android:layout_height="wrap_content" />


	<LinearLayout
		android:id="@+id/addViewCache"
		android:layout_width="wrap_content"
		android:layout_height="wrap_content">
		<ImageView
			android:id="@+id/imgAddViewCache"
			android:layout_width="fill_parent"
			android:layout_height="wrap_content" />

	</LinearLayout>

</LinearLayout>


set_view.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
	xmlns:android="http://schemas.android.com/apk/res/android"
	android:orientation="vertical"
	android:layout_width="fill_parent"
	android:layout_height="fill_parent">
	<TextView
		android:text="set_view"
		android:layout_width="fill_parent"
		android:layout_height="wrap_content" />
	<LinearLayout
		android:id="@+id/content"
		android:orientation="vertical"
		android:layout_width="wrap_content"
		android:layout_height="wrap_content">
		<ImageView
			android:id="@+id/imgSource1"
			android:layout_width="wrap_content"
			android:layout_height="wrap_content" />
		<ImageView
			android:id="@+id/imgSource2"
			android:layout_width="wrap_content"
			android:layout_height="wrap_content" />
	</LinearLayout>

	<LinearLayout
		android:id="@+id/cache"
		android:layout_width="wrap_content"
		android:layout_height="wrap_content">
		<ImageView
			android:id="@+id/imgCache"
			android:layout_width="wrap_content"
			android:layout_height="wrap_content" />

	</LinearLayout>
</LinearLayout>


AddViewActivity
package com.zart;

import android.app.Activity;
import android.graphics.Bitmap;
import android.os.Bundle;
import android.util.Log;
import android.view.View.MeasureSpec;
import android.view.ViewGroup.LayoutParams;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.RelativeLayout;

public class AddViewActivity extends Activity {

	private LinearLayout addViewContent;
	private ImageView imgAddViewCache;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		// TODO Auto-generated method stub
		super.onCreate(savedInstanceState);
		setContentView(R.layout.add_view);
		addViewContent = (LinearLayout) findViewById(R.id.addViewContent);
		imgAddViewCache = (ImageView) findViewById(R.id.imgAddViewCache);
		// addImgSource();
		addRelativeLayout();

		addViewContent.setDrawingCacheEnabled(true);
		addViewContent.measure(MeasureSpec.makeMeasureSpec(0,
				MeasureSpec.UNSPECIFIED), MeasureSpec.makeMeasureSpec(0,
				MeasureSpec.UNSPECIFIED));
		addViewContent.layout(0, 0, addViewContent.getMeasuredWidth(),
				addViewContent.getMeasuredHeight());

		addViewContent.buildDrawingCache();
		int color = addViewContent.getDrawingCacheBackgroundColor();

		Bitmap cacheBitmap = addViewContent.getDrawingCache();
		Bitmap bitmap = Bitmap.createBitmap(cacheBitmap);// 注意:这地方必须特别注意
		if (bitmap != null) {
			imgAddViewCache.setImageBitmap(bitmap);
			imgAddViewCache.setDrawingCacheBackgroundColor(color);
		} else {
			Log.i("CACHE_BITMAP", "DrawingCache=null");
		}
	}

	private void addRelativeLayout() {
		// TODO Auto-generated method stub
		RelativeLayout.LayoutParams layoutpare = new RelativeLayout.LayoutParams(
				LayoutParams.FILL_PARENT, LayoutParams.WRAP_CONTENT);

		RelativeLayout relativeLayout = new RelativeLayout(this);
		relativeLayout.setLayoutParams(layoutpare);

		ImageView imgView1 = new ImageView(this);
		ImageView imgView2 = new ImageView(this);
		imgView1.setImageResource(R.drawable.source1);
		imgView2.setImageResource(R.drawable.source2);
		RelativeLayout.LayoutParams img1 = new RelativeLayout.LayoutParams(38,
				38);
		img1.addRule(RelativeLayout.ALIGN_PARENT_LEFT, RelativeLayout.TRUE);
		RelativeLayout.LayoutParams img2 = new RelativeLayout.LayoutParams(38,
				38);
		img2.addRule(RelativeLayout.ALIGN_PARENT_RIGHT, RelativeLayout.TRUE);

		relativeLayout.addView(imgView1, img1);
		relativeLayout.addView(imgView2, img2);
		addViewContent.addView(relativeLayout);
	}

	/**
	 * 添加图片源
	 */
	private void addImgSource() {
		ImageView imgView1 = new ImageView(this);
		ImageView imgView2 = new ImageView(this);
		imgView1.setImageResource(R.drawable.source1);
		imgView2.setImageResource(R.drawable.source2);
		addViewContent.addView(imgView1, new LayoutParams(
				LinearLayout.LayoutParams.WRAP_CONTENT,
				LinearLayout.LayoutParams.WRAP_CONTENT));
		addViewContent.addView(imgView2, new LayoutParams(
				LinearLayout.LayoutParams.WRAP_CONTENT,
				LinearLayout.LayoutParams.WRAP_CONTENT));
	}

}


MainActivity
package com.zart;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;

public class MainActivity extends Activity implements OnClickListener {

	private Button btn_setView;
	private Button btn_addView;
	
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		// TODO Auto-generated method stub
		super.onCreate(savedInstanceState);
		setContentView(R.layout.main);
		btn_setView = (Button) findViewById(R.id.setview);
		btn_addView = (Button) findViewById(R.id.addview);
		btn_setView.setOnClickListener(this);
		btn_addView.setOnClickListener(this);
	}
	
	@Override
	public void onClick(View view) {
		// TODO Auto-generated method stub
		switch (view.getId()) {
		case R.id.setview:
			Intent intent1 = new Intent();
			intent1.setClass(this, SetViewActivity.class);
			startActivity(intent1);
			break;
		case R.id.addview:
			Intent intent2 = new Intent();
			intent2.setClass(this, AddViewActivity.class);
			startActivity(intent2);
			break;
		default:
			break;
		}
		

	}


}


SetViewActivity
package com.zart;

import android.app.Activity;
import android.graphics.Bitmap;
import android.os.Bundle;
import android.util.Log;
import android.view.View.MeasureSpec;
import android.widget.ImageView;
import android.widget.LinearLayout;

public class SetViewActivity extends Activity {
	/** Called when the activity is first created. */
	private LinearLayout contentLayout;
	private ImageView imgSource1;
	private ImageView imgSource2;
	private ImageView imgCache;

	@Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.set_view);
		contentLayout = (LinearLayout) findViewById(R.id.content);
		imgSource1 = (ImageView) findViewById(R.id.imgSource1);
		imgSource2 = (ImageView) findViewById(R.id.imgSource2);
		imgCache = (ImageView) findViewById(R.id.imgCache);

		imgSource1.setImageResource(R.drawable.source1);
		imgSource2.setImageResource(R.drawable.source2);
		
		contentLayout.setDrawingCacheEnabled(true);
		contentLayout.measure(
				MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED),
				MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED));
		contentLayout.layout(0, 0, contentLayout.getMeasuredWidth(),
				contentLayout.getMeasuredHeight());

		contentLayout.buildDrawingCache();
		
		Bitmap bitmap= contentLayout.getDrawingCache();
		if(bitmap!=null){
			imgCache.setImageBitmap(bitmap);
		}else{
			Log.i("CACHE_BITMAP", "DrawingCache=null");
		}
	}
}


转自:http://hddev.blog.51cto.com/3365350/629808
只为学习。
  • 大小: 11.2 KB
分享到:
评论

相关推荐

    android 把一个view视图转换成bitmap 保存到本地

    在Android开发中,有时我们需要将View的显示内容截图并保存为Bitmap,以便进行分享或者其他图形处理操作。这个过程涉及到Android的视图系统、图形处理以及文件存储等多个知识点。以下将详细讲解如何实现这一功能。 ...

    Android View转成Bitmap

    在Android开发中,将View转换为Bitmap是一种常见的需求,尤其在实现屏幕截图、保存或分享View内容、创建自定义控件或动态生成图片等场景下。以下是对如何将Android View转换为Bitmap的深入解析,包括代码逻辑分析、...

    android 获取界面部分view,view截图,生成bitmap图片

    首先创建一个与View大小相同的Bitmap,然后创建一个与Bitmap关联的Canvas,最后调用View的`draw(Canvas)`方法将View的内容绘制到Canvas上。以下是一个简单的示例代码: ```java View view = findViewById(R.id....

    canvas 转换成bitmap

    在这篇文章中,我们将详细介绍如何将 Canvas 转换为 Bitmap,并将其显示在 ImageView 中。 首先,让我们了解为什么需要将 Canvas 转换为 Bitmap。在 Android 中,Canvas 是一个用于绘制图形的组件,但它不能直接...

    Android中将Bitmap转换成单色的Bmp图片

    Android不支持将Bitmap转换成单色的Bmp图片,所以参考Bmp格式说明,自己写了一个转换类。亲测有效!!!

    Android图片Bitmap和字符串String之间的相互转换

    - **分享功能**:当分享图片时,可以将Bitmap转换为String,然后嵌入到分享链接的HTML中。 提供的`PicDemo`压缩包文件可能包含了实现这些转换的工具类和示例代码。通过阅读和学习这些代码,开发者可以更好地理解和...

    自定义View并将其转化成Bitmap

    在得到包含自定义View内容和文案的Bitmap后,你可以根据小程序的接口要求,将其转换为适合的格式(例如Base64编码的字符串),然后通过API进行分享。 ```java ByteArrayOutputStream stream = new ...

    将Bitmap转换为Byte[]

    本篇文章将详细解释如何在VC中将Bitmap对象转换为Byte数组。 首先,理解Bitmap对象。Bitmap是Windows GDI(Graphics Device Interface)中的一个重要组件,用于存储和操作图像。它包含了图像的宽度、高度、颜色深度...

    将Bitmap转成byte[]小例子

    在Android开发中,Bitmap是用于表示图像数据的一种对象,它在内存中占用较大空间,因此在处理图片时,我们有时需要将其转换为byte数组(byte[]),以便于存储、传输或者在网络流中使用。这个过程涉及到图像数据的...

    截取View转为图片

    在Android开发中,有时我们需要将一个View转换成图片进行保存或者分享,比如截图、制作预览图等。这个过程涉及到的主要知识点是View的绘制和Bitmap的处理。下面将详细讲解如何实现这一功能。 首先,我们要了解`View...

    Bitmap图像转halcon图像

    在进行机器视觉项目时,有时我们需要将Bitmap图像转换为Halcon能识别的图像类型,即HObject,以便在Halcon中进行后续的图像分析和处理。下面我们将详细讲解如何实现这个转换过程,并探讨相关的IT知识点。 首先,让...

    图片比例缩放以及bitMap转BitmapDrawable

    总结来说,图片比例缩放和Bitmap转BitmapDrawable是Android开发中的基础技能,它们涉及到内存管理、性能优化以及用户界面的美观性。理解并熟练掌握这些技巧对于构建高质量的Android应用至关重要。通过阅读博文和研究...

    Halcon_Bitmap转换

    本文将深入探讨如何在Visual C++(VC)环境中,利用Halcon进行Bitmap(位图)转换,特别关注如何获取图像像素信息,并将其转换为灰度图像。 #### 一、Halcon与VC的集成:图像读取与指针获取 在VC中使用Halcon进行...

    Android中把bitmap存成BMP格式图片的方法

    在Android开发中,有时我们需要将Bitmap对象转换成不同的图片格式,比如BMP。BMP(Bitmap File Format)是一种常见的位图文件格式,但它并不像JPEG或PNG那样被Android SDK直接支持。本文将详细介绍如何在Android中将...

    针对图片字体,为Bitmap Font Generator自动生成配置文件

    如:图片内容为“1”命名为“1.png”,图片内容为“万”命名为“万.png” 2、将该软件放在图片所在文件夹下。 3、运行该软件。①提示“请输入字体大小(如24)”,输入字体的大小,然后回车;②提示“请输入...

    android中对Bitmap图片设置任意角为圆角

    本篇文章将深入探讨如何在Android中对Bitmap图片进行处理,使其能够以任意角度显示为圆角,以及涉及到的相关技术。 首先,我们要理解Android中的ImageView组件,它是用来显示图像的视图,可以显示Bitmap或者从资源...

    C# Bitmap转RGB32(NI)

    3. **遍历像素并复制**: 接下来,我们需要遍历原始Bitmap的每一个像素,将其转换为RGB32格式,并复制到新Bitmap中。这可以通过LockBits和Marshal.Copy实现,以提高性能。 ```csharp Rectangle rect = new Rectangle...

    Bitmap位图旋转范例

    在Android开发中,我们经常会遇到需要对Bitmap进行各种操作的情况,其中旋转Bitmap就是一种常见的需求,比如用户拍摄照片后需要调整角度,或者在设计UI时需要动态调整图片的方向。这个“Bitmap位图旋转范例”是一个...

    Android开发者学习笔记——View、Canvas、bitmap

    Android 开发者学习笔记——View、Canvas、bitmap 是 Android 开发中常用的类,本文将通过实例讲解 View、Canvas 等相关知识点。 从资源中获取位图 在 Android 开发中,获取位图可以使用 BitmapDrawable 或 ...

Global site tag (gtag.js) - Google Analytics