转载请标明出处:
http://blog.csdn.net/tyzlmjj/article/details/50747173
本文出自:【M家杰的博客】
概述
RenderScript是安卓官方的高性能计算框架。它可以自动的利用多核心CPU的性能,不需要我们自己去处理,我们只要写好算法就OK了。RenderScript 的主要应用还是在图像、视频等等的处理上。这篇博客主要是我看完官方文档之后的记录。
在module的build.gradle中添加
android {
defaultConfig {
……
//启用renderscript
renderscriptTargetApi = 18
renderscriptSupportModeEnabled = true
}
}
在java类中使用时引入兼容包
import android.support.v8.renderscript.*;
注意:引入上面的兼容库是官方推荐的做法,目的主要是为了APP在各个版本上的兼容性更好(可以支持最低API 8)。如果你不想引入兼容库,那就不做上面的操作,直接用import android.renderscript.*;
,支持最低API 11。
先贴一段使用RenderScript自带的图片模糊的代码,可以更好的理解。
还有一个官方的Demo可以看看
public static void blurByRenderScript(Bitmap bitmap,int radius, ImageView view,Context context)
{
RenderScript rs = RenderScript.create(context);
Allocation allocation = Allocation.createFromBitmap(rs, bitmap);
ScriptIntrinsicBlur blur = ScriptIntrinsicBlur.create(rs, allocation.getElement());
blur.setInput(allocation);
blur.setRadius(radius);
blur.forEach(allocation);
allocation.copyTo(bitmap);
view.setImageBitmap(bitmap);
rs.destroy();
}
用.create()
方法创建实例,有好几个重载的方法可以选。同一时间点最好只创建一个RenderScript实例
RenderScript rs = RenderScript.create(context);
Allocation类用于存储需要进行处理的对象数据。包含很多静态创建方法,比较常用的是createFromBitmap(…)
和createTyped(…)
Allocation allocation = Allocation.createFromBitmap(rs, bitmap);
这里脚本需要分成两类:
.rs
文件。编译器会为我们自动映射一个java类,名字是ScriptC_文件名
。假如我们写的文件是abc.rs
,映射的类名就是ScriptC_abc
,实例化操作如下:ScriptC_abc abc = new ScriptC_abc(rs);
ScriptIntrinsicBlur blur = ScriptIntrinsicBlur.create(rs,allocation.getElement());
RenderScript内置的脚本设置参数就不用说了,主要讲下我们自定义的脚本如何在java中赋值。
如果在你自己写的.rs
文件中需要使用到额外的参数,你可以定义全局变量,比如int xyz;
,那么自动映射的java类中将会自动产生get和set方法,如set_xyz(int);
。这样就可以在java代码中做赋值操作,你需要做的仅仅是定义全局变量。
注意:静态变量和常量不会生成set方法,只有get。
最终执行一般调用forEach
方法。在自定义的.rs
文件中,有参数的方法都会映射两个java方法forEach_方法名
,一个是参数跟你自己定义相同的方法,另一个重载的方法是多了一个Script.LaunchOptions类型的参数,可以设置x、y、z三个维度的起点和结束点(比如可以针对图片的某个区域进行操作)。
将计算完成的数据从Allocation中复制出来,调用copyto(…)
方法。
例如复制到一个bitmap
allocation .copyTo(bitmap);
最后,不要忘记销毁RenderScript实例,调用它的destroy()
方法销毁。