之前项目中,有个需求是对Activtiy背景进行虚化,实现毛玻璃效果。实现的大体思路:
- 对手机屏幕进行截屏处理,获得截屏图片的bitmap;
- 对bitmap进行相应的config处理和缩放像素处理;
- 通过高斯模糊算法对处理后的bitmap进行虚化;
- 将虚化后的bitmap作为背景图展示。
虽然实现了,但由于效果不佳或是影响性能,最终选择放弃。最近闲的没事,准备将这件事给完成。
因为之前对bitmap的算法处理是通过java代码实现的,如果想提高性能或是减少处理时间,达到秒开的效果,必须设置虚化的程度低,但这样效果并不好看,但只是一味追求效果,由于java代码运行比较慢,在处理时间上必定会有延迟,总之就是有性能没效果,有效果没性能的矛盾,体验十分不佳,网上也给出过方案是通过c的方式实现,今天就来完成,随便回顾一遍jni的流程,长时间不碰全忘…
###配置NDK,生成.so动态库
- build.gradle文件下,添加ndk配置:1234567891011121314android {defaultConfig {minSdkVersion 21targetSdkVersion 25...ndk {moduleName "blur_lib" // 动态库名称abiFilters "armeabi", "armeabi-v7a", "x86" // 相应的架构平台ldLibs "log" //log输出ldLibs "jnigraphics" //graphic相关jni}}...}
项目的gradle.properties添加支持NDKandroid.useDeprecatedNdk=true
local.properties添加ndk-bundle路径ndk.dir=C\:\\Users\\Administrator\\AppData\\Local\\Android\\Sdk\\ndk-bundle
- 创建NativeHelper类如下:1234567public class NativeHelper {static {System.loadLibrary("blur_lib");}// 参数r为对bitmap虚化的程度范围static native void blurBitmap(Object bitmap, int r);}
在Terminal中cd到java目录下生成.h头文件,方便得到c中的类名,输入命令行:javah -jni com.pecoo.blurjnidemo.NativeHelper
- main下创建一个jni folder,里面创建.c/c++和.h头文件,高斯算法代码粘进来,并在.h头文件进行相应的方法申明。
- 再创建一个c/c++文件
|
|
5.生成.so动态库:Build->Rebuild Project完成后,会在build文件下生成相应平台的.so。
若失败试试D:\workspace\ndk\NDKDemo\myapplication\src\main>javah -d jni -classpath C:\Users\Administrator\AppData\Local\Android\Sdk\platforms\android-20\android.jar;..\..\build\intermediates\classes\debug com.pecoo.myapplication.NativeUtils
虚化图片,实现效果:
对于截屏,获取到截屏的bitmap步骤这儿就忽略了,直接拿张资源图片进行处理,显示在界面上
子线程中调用处理bitmap的本地函数
最后把 github地址发一下,仅供参考。