android截图方法:(以下是转载的)
方法一:
View view= getWindow().getDecorView();
Bitmap bmp = Bitmap.createBitmap(480, 800, Bitmap.Config.ARGB_8888);
view.draw(new Canvas(b));
bmp就是截取的图片了,可通过bmp.compress(CompressFormat.PNG, 100, new FileOutputStream(file));把图片保存为文件。
方法二:
getWindow().getDecorView().setDrawingCacheEnabled(true);
bmp=getWindow().getDecorView().getDrawingCache();
但这样得到的图片是包含状态栏和标题栏的,如果想把状态栏和标题栏去掉,可把得到的图片顶部一部分剪裁掉。
1、得到状态栏高度
Rect rect = new Rect();
view.getWindowVisibleDisplayFrame(rect);
int statusBarHeight = rect.top;
System.out.println("状态栏高度:" + statusBarHeight);
2、得到标题栏高度
int wintop = getWindow().findViewById(android.R.id.content).getTop();
int titleBarHeight = wintop - statusBarHeight;
System.out.println("标题栏高度:" + titleBarHeight);
注:这样得到的截图是不会包含dialog和popupwindow的,你必须单独得到popupwindow的截图,然后再和背景截图合到一起。
另外,截图的相关代码是不能放到oncreate中的,因为这时候getDectorView()得到的是null
把两个bitmap合到一起的方法很简单。
Bitmap bmpall=Biatmap.createBitmap(width,height,Config.ARGB_8888);
Canvas canvas=new Canvas(bmpall);
canvas.drawBitmap(bmp1,x,y,paint);
canvas.drawBitmap(bmp2,x,y,paint);
得到的bmpall就是合在一起的图片了。
ps:按理说也getWindow.findViewById(android.R.id.content)得到的view就是不包含状态栏和标题栏的view,但这个我还没有试过。
问题:
方法二我试过,略不靠谱,当布局中有抽屉布局时更是无法使用(至少我当时程序是这样),也经常会有黑屏出现,后来使用了方法一,基本上都不会有这些问题。下面是我程序中用到的截图:
/** * 动画效果工具类 * * @author wyr * @since 2012 * */ public class AnimUtil { /** * 程序退出动画 * * @param activity */ // public static void exitWithAnim(final Activity activity) { // Animation exitAnimation = new ExitAnimation(); // Animation bgAnim = AnimationUtils.loadAnimation(activity, // R.anim.alpha_anim); // RelativeLayout relativeLayout = new RelativeLayout(activity); // relativeLayout.setBackgroundColor(Color.BLACK); // ImageView bgView = new ImageView(activity); // BitmapFactory.Options options = new Options(); // options.inSampleSize = 2; // Bitmap bmpBg = BitmapFactory.decodeResource(activity.getResources(), // R.drawable.bg_na, options); // bgView.setScaleType(ScaleType.FIT_XY); // bgView.setImageBitmap(bmpBg); // ImageView im = new ImageView(activity); // Bitmap bmp = BitmapFactory.decodeResource(activity.getResources(), // R.drawable.ty_bg, options); // im.setScaleType(ScaleType.FIT_XY); // im.setImageBitmap(bmp); // relativeLayout.addView(bgView); // relativeLayout.addView(im); // bgView.getLayoutParams().width = TyWeatherActivity.screenWidth; // bgView.getLayoutParams().height = TyWeatherActivity.screenHeight; // im.getLayoutParams().width = TyWeatherActivity.screenWidth; // im.getLayoutParams().height = TyWeatherActivity.screenHeight; // ((Activity) activity).setContentView(relativeLayout); // bgView.startAnimation(bgAnim); // im.startAnimation(exitAnimation); // exitAnimation.setAnimationListener(new AnimationListener() { // // @Override // public void onAnimationStart(Animation animation) { // // TODO Auto-generated method stub // // } // // @Override // public void onAnimationRepeat(Animation animation) { // // TODO Auto-generated method stub // // } // // @Override // public void onAnimationEnd(Animation animation) { // // TODO Auto-generated method stub // ((Activity) activity).finish(); // android.os.Process.killProcess(android.os.Process.myPid()); // } // }); // } /** * 程序退出动画 * * @param activity */ public static void exitWithAnim(final Activity activity) { Animation exitAnimation = new ExitAnimation(); View view = activity.getWindow().getDecorView(); Bitmap bmp = Bitmap.createBitmap(TyWeatherActivity.screenWidth, TyWeatherActivity.screenHeight, Config.ARGB_8888); view.draw(new Canvas(bmp)); view.startAnimation(exitAnimation); exitAnimation.setAnimationListener(new AnimationListener() { @Override public void onAnimationStart(Animation animation) { // TODO Auto-generated method stub } @Override public void onAnimationRepeat(Animation animation) { // TODO Auto-generated method stub } @Override public void onAnimationEnd(Animation animation) { // TODO Auto-generated method stub ((Activity) activity).finish(); android.os.Process.killProcess(android.os.Process.myPid()); } }); } }