android应用内截图问题

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());
			}
		});
	}
}


 

 

你可能感兴趣的:(android应用内截图问题)