Android窗口截屏

步骤:

第一步:获取保存屏幕图像的Bitmap对象;

第二步 得到状态栏的高度;

第三步 获取屏幕图像的高度;

第四步 创建新的Bitmap对象 并截取除了状态栏的其他区域;

第五步 将屏幕图像保存到sd卡的根目录


代码如下:

package com.example.activityproperty;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;

import android.annotation.SuppressLint;
import android.app.Activity;
import android.graphics.Bitmap;
import android.graphics.Point;
import android.graphics.Rect;
import android.os.Bundle;
import android.os.Handler;
import android.view.View;
import android.widget.Toast;

public class MainActivity extends Activity {

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		// TODO Auto-generated method stub
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);

	}

	@SuppressLint("NewApi") public void onClick_CaptureScreen(View view) {
		// 使用延迟运行 ,防止单击按钮时还没有抬起就截取屏幕图像
		new Handler().postDelayed(new Runnable() {

			@SuppressLint("NewApi") @Override
			public void run() {
				// 获取窗口的顶层视图对象
				View v = getWindow().getDecorView();
				v.setDrawingCacheEnabled(true);
				v.buildDrawingCache();

				// 第一步:获取保存屏幕图像的Bitmap对象

				Bitmap srcBitmap = v.getDrawingCache();

				Rect frame = new Rect();
				// decorView是window中的最顶层view,可以从window中获取到decorView,然后decorView有个getWindowVisibleDisplayFrame方法可以获取到程序显示的区域,包括标题栏,但不包括状态栏。
				getWindow().getDecorView().getWindowVisibleDisplayFrame(frame);

				// 第二步 得到状态栏的高度
				int statusHeight = frame.top;
				// 第三步 获取屏幕图像的高度
				Point outSize = new Point();

				getWindowManager().getDefaultDisplay().getSize(outSize);

				int width = outSize.x;

				int height = outSize.y;

				// 第四步 创建新的Bitmap对象 并截取除了状态栏的其他区域
				Bitmap bitmap = Bitmap.createBitmap(srcBitmap, 0, statusHeight,
						width, height - statusHeight);

				v.destroyDrawingCache();

				FileOutputStream fos = null;

				try {
					File file = File.createTempFile("capture", ".jpg",
							new File("/sdcard"));

					fos = new FileOutputStream(file);

					if (null != fos) {
						// 第五步 :将屏幕图像保存到sd卡的根目录
						bitmap.compress(Bitmap.CompressFormat.PNG, 90, fos);
						fos.flush();
						Toast.makeText(MainActivity.this,
								"保存成功" + file.getName(), 0).show();
					}else{
						
						Toast.makeText(MainActivity.this,"失败", 0).show();
						
						}
					fos.close();

				} catch (IOException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}

			}
		}, 2000);
	}
}

注意操作SD的权限需要添加。

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。