Andorid 实现 Launcher桌面快速模糊 13毫秒左右
2016-01-07 14:39
190 查看
桌面的模糊,比较蛋疼。效率一直是一个问题,因为桌面要合成壁纸+桌面+模糊。
我的做法如下:
1、拿到桌面的View,通过View获取到图片Bitmap(这个是整个桌面当前可见的缓存图片,并且对图片进行按比例缩放,降低图片的质量)
2、拿到当前壁纸图片(需要对壁纸进行当前屏幕裁剪,因为壁纸是滚动的,还有适当进行图片压缩)
3、将拿到的桌面Bimap 和壁纸Bitmap 2张图进行合成一张,最后,将这张图进行高斯模糊。
代码如下:
//获取壁纸我就不说了,根据壁纸类,拿壁纸的偏移量*WorkSpace的宽度,就可以裁剪出,当前屏幕的Bitmap。
我的做法如下:
1、拿到桌面的View,通过View获取到图片Bitmap(这个是整个桌面当前可见的缓存图片,并且对图片进行按比例缩放,降低图片的质量)
2、拿到当前壁纸图片(需要对壁纸进行当前屏幕裁剪,因为壁纸是滚动的,还有适当进行图片压缩)
3、将拿到的桌面Bimap 和壁纸Bitmap 2张图进行合成一张,最后,将这张图进行高斯模糊。
代码如下:
Bitmap mBlurBitmap=null; Canvas mCanvas=null; Paint drawPaint=null; float scaleFactor = 12; int radius = 5; public boolean blurLayout(){ long startTime = System.nanoTime(); //开始时间 if(mBlurBitmap==null) { if(getWidth()<=0||getHeight()<=0){ return false; } mBlurBitmap = Bitmap.createBitmap((int)(getMeasuredWidth()/scaleFactor), (int)(getMeasuredHeight()/scaleFactor), Bitmap.Config.ARGB_4444); } mBlurBitmap.eraseColor(Color.TRANSPARENT); if(mCanvas==null){ mCanvas=new Canvas(mBlurBitmap); } if(drawPaint==null){ drawPaint=new Paint(); // drawPaint.setStyle(Paint.Style.FILL); drawPaint.setFlags(Paint.FILTER_BITMAP_FLAG); } Bitmap mWallpaperBitmap=getWallpaper(); if(mWallpaperBitmap==null){ return false; } mCanvas.save(); mCanvas.clipRect(new Rect(0, 0, getWidth(), getHeight())); //将图片缩小到原来的1/12 mCanvas.translate(-getLeft() / scaleFactor, -getTop() / scaleFactor); mCanvas.scale(1 / scaleFactor, 1 / scaleFactor); //画壁纸 mCanvas.drawBitmap(mWallpaperBitmap,0,0,drawPaint); //画屏幕 View mView=Launcher.getLauncher().getBlurView(); mView.draw(mCanvas); mCanvas.restore(); long consumingTime = System.nanoTime() -startTime; //消耗时间 Bitmap lastBitmap=NativeStackBlur.process(mBlurBitmap, radius); Log.d("blurLayout", "blur_bg:" + consumingTime/1000000); setImageBitmap(lastBitmap); return false; }
//获取壁纸我就不说了,根据壁纸类,拿壁纸的偏移量*WorkSpace的宽度,就可以裁剪出,当前屏幕的Bitmap。
相关文章推荐
- 【探究】NoSQL数据库学习(一)
- 背包问题
- android studio应用(一):导入eclipse项目
- SQL笔记(13)_第十三章 查询里结合表
- Protobuf使用不当导致的程序内存上涨问题
- BZOJ1010 [HNOI2008] 玩具装箱toy
- 网页模仿
- VC程序移植到Linux下注意事项
- JCF框架源码分析系列-开头篇(一)
- java synchronized详解
- iOS精益求精 设计模式
- 详解Linux内核之双向循环链表
- Android NDK开发之 ARM与NEON指令说明
- 批量裁剪GIS数据(包含GDB,MDB,Shp)
- Struts2中的ModelDriven机制及其运用
- 解决div下放img标签,会出现空隙的情况
- SQL Server中Text和varchar(max)数据类型区别
- 数据结构-数组详解例子
- matlab的m程序转执行文件exe
- Sicily 1390. Surprising Strings