Android视图框架对于创建复杂布局非常方便。然而,这种便利是以性能为代价的。当性能至关重要的时候,Android提供了几种更强大的图形处理能力,当然难度也是随之上升了。在本节中,我将介绍:

(1)SurfaceView使用标准的Canvas对象并与单独的渲染进程结合,得到更好的性能;

(2)新得RenderScript框架可以被用于创建独立结构的图形渲染;

(3)OpenGL可用于一些严格的图形工作和游戏。

2、RenderScript创建独立结构的图形渲染

RenderScript是用来在Android上编写的高性能代码的一种语言,API。RenderScript由Android 3.0引进,它包括图形API和与CUDA或者OpenGL类似的运算API。它是独立与构架的,所以不需要为不同的CPU或者GPU处理器定制代码。RenderScript通过选择合适的处理器和内核数目来优化运行代码。如果没有合适的GPU,RenderScript会在CPU上运行所有的操作作为备用,是非常灵活的。

注意:RenderScript依赖于OpenGL,部android设备,模拟器是不可用的。

RenderScript使用的语法基于C编程语言的C99标准。学习过C语言开发的人可以很快的上手。

注意:renderscript 在多字节的目标代码页中,没有此 Unicode 字符可以映射到的字符,是因为路径中有中文。

注意:RSSurfaceView : The type RSSurfaceView is deprecated 在API 16之后,网上的例子大部分都是使用RSSurfaceView的。

2.1 介绍RenderScript实例之前,我必须说一下Allocation类。

这个类提供了通过数据传递和RenderScript内核的主要方法。为已经实例的类(RenderScript)提供存储空间和特定类型。

2.2 RenderScript实例编写mono.rs文件

#pragma version(1)#pragma rs java_package_name(com.example.renderscript)const static float3 gMonoMult1 = {0.299f, 0.587f, 0.114f};void root(const uchar4 *v_in, uchar4 *v_out, uint32_t i,uint32_t y) {    float4 f4 = rsUnpackColor8888(*v_in);//将输入的颜色值转化为r g b a    float3 mono = dot(f4.rgb, gMonoMult1);//计算向量的点积*v_out = rsPackColorTo8888(mono);}

int root(viod):程序入口,根据返回值(ms)作刷新,当然也可以不带,这里我就没有用返回值。这里你能够通过由实例化的类(ScriptC_script_name)来创建一个Renderscript对象从Android框架代码中调用Renderscript(如下代码)。这个类包含了一个forEach_root()方法,它会调用rsForeach()方法。你能够传递给它与Renderscript运行时级别调用相同的参数。这种技术允许你的Android应用程序把高精度的数学计算转交给Renderscript(底下我只是传递了一张图片信息)。

当然,如果你修改了rs文件,那么这时候你需要做的就是删除gen目录下对应的ScriptC_mono.java文件,然后删除目录下的mono.d文件,此时系统会重新生成对应的文件,更新你修改的mono.rs文件。

在Android框架层次调用Renderscript的方法:

1.在你的Android框架代码中分配Renderscript所需要的内存。对于Androi3.2(API Level 13)以前的版本,需要分配输入和输出内存。Android4.0(API Level 14)以后的平台版本只需要分配其中之一的内存或两个都分配。

2.创建ScriptC_scritp_name类的一个实例。

3.调用forEach_root()方法,并传入分配的内存、Renderscript和其他的可选的用户定义的数据。输出内存中将会包含Renderscript的输出结果。

2.3Activity文件的编写

public class MainActivity extends Activity {    private Bitmap mBitmapIn;//图片资源    private Bitmap mBitmapOut1;//输出图片    private Bitmap mBitmapOut2;//输出图片    private Bitmap mBitmapOut3;//输出图片    private Bitmap mBitmapOut4;//输出图片    private RenderScript mRS;    private Allocation mInAllocation;    private Allocation mOutAllocation;private ScriptC_mono mScript;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.main);        mBitmapIn = loadBitmap(R.drawable.ic_launcher);        mBitmapOut1 = Bitmap.createBitmap(mBitmapIn.getWidth(), mBitmapIn.getHeight(),                                         mBitmapIn.getConfig());//创建了视图空间        ImageView in = (ImageView) findViewById(R.id.displayin);        in.setImageBitmap(mBitmapIn);        ImageView out = (ImageView) findViewById(R.id.displayout);        out.setImageBitmap(mBitmapOut1);        createScript();    }    private void createScript() {        mRS = RenderScript.create(this);        mInAllocation = Allocation.createFromBitmap(mRS, mBitmapIn,                                                    Allocation.MipmapControl.MIPMAP_NONE,                                                    Allocation.USAGE_SCRIPT);        mOutAllocation = Allocation.createTyped(mRS, mInAllocation.getType());        //获得和位图一相同的属性        mScript = new ScriptC_mono(mRS, getResources(), R.raw.mono);//实例化RenderScript中的函数        mScript.forEach_root(mInAllocation, mOutAllocation);//调用RenderScript中的函数        mOutAllocation.copyTo(mBitmapOut1);    }    /***********************************************************************     * 装入图片资源     * @param resource     * @return     */    private Bitmap loadBitmap(int resource) {        final BitmapFactory.Options options = new BitmapFactory.Options();        options.inPreferredConfig = Bitmap.Config.ARGB_8888;        return BitmapFactory.decodeResource(getResources(), resource, options);    }}

这里我们使用createScript()函数中的:

mScript = new ScriptC_mono(mRS, getResources(), R.raw.mono);//实例化RenderScript中的函数 mScript.forEach_root(mInAllocation, mOutAllocation); //调用RenderScript中的函数

就是我们使用mono.rs文件中的root函数的实现,然后我们把他显示在图片二上。

mOutAllocation.copyTo(mBitmapOut1);

2.4XML文件的编写以及效果

<ImageView        android:id="@+id/displayin"        android:layout_width="320dip"        android:layout_height="266dip" />    <ImageView        android:id="@+id/displayout"        android:layout_width="320dip"        android:layout_height="266dip"        android:layout_alignParentBottom="true"        android:layout_alignParentRight="true" />


这里也是参考了源码中的例子,大家可以参考参考,这里只是一个简单的实例。

更多相关文章

  1. 一款常用的 Squid 日志分析工具
  2. GitHub 标星 8K+!一款开源替代 ls 的工具你值得拥有!
  3. RHEL 6 下 DHCP+TFTP+FTP+PXE+Kickstart 实现无人值守安装
  4. Linux 环境下实战 Rsync 备份工具及配置 rsync+inotify 实时同步
  5. 解决IE apk变成zip:Android(安卓)手机应用程序文件下载服务器 配
  6. Android(安卓)入门第九讲03-动画(帧动画(点击开始,停止)+补间动画(透
  7. android内部存储器和外部存储器
  8. 百度地图的基本使用
  9. Android(安卓)性能优化(62)---存检测、卡顿优化、耗电优化、APK

随机推荐

  1. Android 禁止响应屏幕翻转
  2. 彻底解决Android 应用方法数不能超过65K
  3. 使用intent调用Android系统自带应用
  4. android VideoView播放工程raw下的视频+
  5. TextView属性android:ellipsize实现跑马
  6. JS获取移动端系统信息(操作系统、操作系
  7. android中Http访问时 connection.getResp
  8. 解决OPPO系统在Android10魔改刘海屏的额
  9. android 获取手机电话号码和短信内容
  10. 第一讲:Android开发环境的搭建