android应用内截图问题

来源:互联网 发布:淘宝饰品店推荐 知乎 编辑:程序博客网 时间:2024/05/19 22:03

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() {@Overridepublic void onAnimationStart(Animation animation) {// TODO Auto-generated method stub}@Overridepublic void onAnimationRepeat(Animation animation) {// TODO Auto-generated method stub}@Overridepublic void onAnimationEnd(Animation animation) {// TODO Auto-generated method stub((Activity) activity).finish();android.os.Process.killProcess(android.os.Process.myPid());}});}}


 

 

原创粉丝点击