Android窗口截屏代码
jopen
10年前
步骤:
第一步:获取保存屏幕图像的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的权限需要添加。