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的权限需要添加。