在做文件夹背景高斯模糊的过程中遇到的截屏功能问题总结:
android高斯模糊算法都已经很成熟了,目前来说还是github上的FastBlur效率最快。因为是要做实时背景模糊,所以会涉及到截屏的功能。刚开始用的是用下面的代码来实现截屏:
private Bitmap screenshot() { View view = getWindow().getDecorView(); view.setDrawingCacheEnabled(true); view.buildDrawingCache(true); /** * 获取当前窗口快照,相当于截屏 */ Bitmap bmp1 = view.getDrawingCache(); return bmp1; }
但是得到截图后,模糊出来的效果一直不是我想要的效果,模糊出来是这样的:
我用别的图片测试过模糊算法绝对没问题,那么问题一定出在截图上,所以我把截图保存下来,导出查看,才发现用上面那个函数得到的截图只是上层的应用图标的图,并没有把桌面背景也一起截进去,背景是透明的,所以才会导致模糊出来的效果是上面那样的:
后来网查了好久都没找到好的截图实现方法。所以自己到SystemUi下面找系统截图的代码,提取了下,自己实现了截屏功能:
private Bitmap takeScreenshot(Context context) { Display display = ((WindowManager) context.getSystemService(Context.WINDOW_SERVICE)).getDefaultDisplay(); DisplayMetrics displayMetrics = new DisplayMetrics();; display.getRealMetrics(displayMetrics); float[] dims = {displayMetrics.widthPixels, displayMetrics.heightPixels}; // Take the screenshot Bitmap screenBitmap = SurfaceControl.screenshot((int) dims[0], (int) dims[1]); return screenBitmap; }不过,在使用这个函数有两个前提,就是在编译的时候要在Android.mk里的加上:
LOCAL_CERTIFICATE := platform
并且在Androidmanifest.xml里加上权限:
<uses-permission android:name="android.permission.READ_FRAME_BUFFER" />
虽然获得截图的效率低了,但是加上高斯模糊后确实达到了我期望的效果: