• Android以当前Activity为基准进行截屏


    概述:

        首先要知道在Android中截取图片大的方面可以分成两个方向,一个是走底层一点,一个是走上层。因为楼主底层代码比较弱,目前也只是停留在a+b的层面。所以,这篇博客只是在应用层上对屏幕进行一个截取。注意,上面讨论的两个方法与游戏中截图是两个概念,游戏中对屏幕的截取可以理解成一种假象。什么样的一种假象呢?没有截屏!因为玩游戏的时候,一般是全屏,这个时候只要保存内存中已经保存了的图像即可。

        对于应用层面的截图,它是基于Activity的。这里只是说是基于Activity,不是说一定是要由Activity来截图。那这句话不是矛盾了么?要怎么理解呢?例如,我现在想要截一张图,那我总得有一个截图的内容吧。就好像说我想把当前运行的程序给截个图,那么当前位于屏幕顶层的Activity就是这个内容了。这个我想要截一张图中的我则可以是Activity,也可以是Service,也可以是广播。


    截图类代码:

    下面大家可以看看已经封装好了的截图类的代码,如下:

    public class ScreenShot {
    
    	// 获取指定Activity的截屏,保存到png文件
    	private static Bitmap takeScreenShot(Activity activity) {
    
    		// View是你需要截图的View
    		View view = activity.getWindow().getDecorView();
    		view.setDrawingCacheEnabled(true);
    		view.buildDrawingCache();
    		Bitmap bitmap = view.getDrawingCache();
    
    		// 获取状态栏高度
    		Rect frame = new Rect();
    		activity.getWindow().getDecorView().getWindowVisibleDisplayFrame(frame);
    		int statusBarHeight = frame.top;
    		System.out.println(statusBarHeight);
    
    		// 获取屏幕长和高
    		int width = activity.getWindowManager().getDefaultDisplay().getWidth();
    		int height = activity.getWindowManager().getDefaultDisplay().getHeight();
    
    		// 去掉标题栏
    		Bitmap b = Bitmap.createBitmap(bitmap, 0, statusBarHeight, width, height - statusBarHeight);
    		view.destroyDrawingCache();
    		return b;
    	}
    
    	// 保存到sdcard
    	private static void savePic(Bitmap b, String strFileName) {
    		FileOutputStream fos = null;
    		try {
    			fos = new FileOutputStream(strFileName);
    			if (null != fos) {
    				b.compress(Bitmap.CompressFormat.PNG, 90, fos);
    				fos.flush();
    				fos.close();
    			}
    		} catch (FileNotFoundException e) {
    			e.printStackTrace();
    		} catch (IOException e) {
    			e.printStackTrace();
    		}
    	}
    
    	public static void shoot(Activity activity) {
    		ScreenShot.savePic(ScreenShot.takeScreenShot(activity), "sdcard/apic/image" + System.currentTimeMillis() + ".png");
    	}
    }

    上面的注释也留得相对详细,这里就不做过多说明了。说了也只是充字数,不必了。


    使用示范:

    ScreenShot.shoot(MainActivity.this);

    运行图例:


    <后续再更新另一种方法。。。>

  • 相关阅读:
    十张伟大的科学瞬间
    机器学习如何破译早已消亡的古老语言?
    如何阻止「数码黑帮」偷走你的时间
    社会地位即服务, Status as a Service (二): 社交网络的投资回报率 (ROI)
    谁是你的创业竞争对手?
    酷!美国国家安全局(NSA)开源了逆向工程工具 Ghidra
    Linux终端下Ctrl+S卡死
    操作系统损坏重装是否能恢复lvm硬盘数据的相关实验
    How to write an iso file to usb driver
    linux screen的用法
  • 原文地址:https://www.cnblogs.com/fengju/p/6336121.html
Copyright © 2020-2023  润新知