準備上4.0項目,最近接觸API 的時候看到了RenderScript 。通過運行google 那幾個項目發現這個真是一個非常不錯的API,但是google 所提供的文檔非常少,有助於瞭解電腦圖形計算,雖然我們做應用編程的不一定要涉及這塊,但涉獵一下總是不錯的。
RenderScript 是Android 平台上的一種類C指令碼語言。要在我們程式上實現RenderScript 渲染功能,最少需要實現的幾個功能如下,以一個Hello Wold 為例:
1. helloworld.rs 實現RenderScript 的代碼
2. RenderScriptRS.java 一個輔助類,簡化操作RenderScript (非必要)
3. RenderScriptView.java 一個繼承於RSSurfaceView的類,用於顯示RenderScript 的渲染或者用來處理使用者的觸摸等視圖
4. RenderScriptHelloWorldActivity.java 這個不用多說,Android 應用程式的介面類
當建立一個RenderScript 的項目的時候,必須在包名下建立一個以rs為尾碼的檔案(位於我們Activity 同包名下),如本篇文章使用的helloworld.rs檔案.
#pragma version(1)
#pragma rs java_package_name(com.xuzhi.rs.helloworld)
#include "rs_graphics.rsh"
int gTouchX;
int gTouchY;
void init(){
gTouchX=50.0f;
gTouchY=50.0f;
}
//application main
int root(void){
rsgClearColor(0.0f,1.0f,0.0f,0.0f);//顏色更改為no red,full green,no blue,no opacity ,的RGBA值
rsgFontColor(1.0f,0.0f,1.0f,1.0f);//設定字型顏色
rsgDrawText("my first renderscript application",gTouchX,gTouchY);//根據應用傳上來的x,y 將字畫在螢幕對應的座標上
rsDebug("======my renderscript debug========",rsUptimeMillis());//列印日誌
return 20;
}
註解:
#pragma:簡單的可以理解告訴或者通知編譯器編譯這個檔案時需要的參數或者指定編譯的版本等,跟編譯器有關。
void init():這個函數作一些初始化動作
int root(viod):程式入口,根據傳回值(ms)作重新整理。比如上面寫的20相當於每20毫秒重新整理一次。
root 函數下rsgClearColor,rsgFontColor,rsgDrawText都位於rs_graphics.rsh標頭檔下。
rsDebug是列印日誌函數,位於rs_core.rsh標頭檔。
在上面的代碼中,日誌將己每20毫秒列印一次這樣的日誌:03-01 11:09:18.289: D/RenderScript(1838): ======my renderscript debug======== 600462 0x9298e
rsUptimeMillis則定義在rs_time.rsh標頭檔中。
目前有關於RenderScript調用的函數位於我們SDK目錄下(platforms/android-*[目前11-15]/renderscript/include)目錄裡面的標頭檔中。
好了,rs檔案己經編寫完成,接著往下走。
下一步,為了方便調用RenderScript 這裡建立了一個輔助類,RenderScriptRS.java。
/**
* Render Script help
* @author terry
*
*/
public class RenderScriptRS {
private RenderScriptGL mRS;
private ScriptC_hellowold mScript;
public RenderScriptRS(RenderScriptGL rs,Resources resource) {
// TODO Auto-generated constructor stub
mRS=rs;
mScript=new ScriptC_helloworld(mRS, resource, R.raw.hellowold);
mRS.bindRootScript(mScript); //綁定指令碼
}
/**
* 傳入座標
* @param x
* @param y
*/
public void onActionDown(int x,int y){
mScript.set_gTouchX(x);
mScript.set_gTouchY(y);
}
}
目前我們所做的一切都是要使用到的RenderScriptGL(RenderScript 圖形的衍生),執行個體化RenderScriptGL並綁定指令碼。如果你的開發ADT高於或者是1.5的話Eclipse 會根據你的rs檔案產生ScriptC_你的rs檔案為名的java類。如上面代碼的ScriptC_helloworld一樣,並且在資來源目錄res/raw產生一個.bc的檔案,在執行個體化ScriptC_hellowold會需要傳進去。
下一步,建立RenderScriptView.java,讓其可以顯示在介面上。
import android.content.Context;
import android.renderscript.RSSurfaceView;
import android.renderscript.RenderScriptGL;
import android.renderscript.RenderScriptGL.SurfaceConfig;
import android.view.MotionEvent;
public class RenderScriptView extends RSSurfaceView {
private RenderScriptGL mRS;
private RenderScriptRS mRender;
public RenderScriptView(Context context) {
super(context);
// TODO Auto-generated constructor stub
initRenderScript();
}
/**
* 初始化RenderScriptRS
*/
private void initRenderScript() {
if (mRS == null) {
RenderScriptGL.SurfaceConfig config = new SurfaceConfig();
mRS = createRenderScriptGL(config);
mRender = new RenderScriptRS(mRS, getResources());
}
}
@Override
protected void onDetachedFromWindow() {
// Handle the system event and clean up
mRender = null;
if (mRS != null) {
mRS = null;
destroyRenderScriptGL();
}
}
@Override
protected void onAttachedToWindow() {
// TODO Auto-generated method stub
super.onAttachedToWindow();
initRenderScript();
}
@Override
public boolean onTouchEvent(MotionEvent event) {
// TODO Auto-generated method stub
/**
* 傳入點擊座標www.2cto.com
*/
if (event.getAction() == MotionEvent.ACTION_DOWN) {
mRender.onActionDown((int) event.getX(), (int) event.getY());
return true;
}
return false;
}
}
RSSurfaceView擴充自SurfaceView,用來顯示這些需要渲染的圖形介面。
上述代碼的initRenderScript方法,如果RenderScriptGL 未執行個體化,就需要建立一個SurfaceConfig(這是用來控制深度的顏色,深度緩衝區等等,這裡使用預設),並且讓它實現自身的onTouchEvent事件,傳入x,y座標軸進入RenderScript,改變文本顯示的位置(跟隨滑鼠的點擊點變化)。
最後的介面只需要讓它顯示出來即可:
public class RenderScriptHelloWorldActivity extends Activity {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(new RenderScriptView(this));
}
}
這一系列的步驟可以用一張圖來做說明,詳細的規划了RenderScript 的圖形概述:
這是一個簡單的DEMO,介紹了RenderScript 使用的一些基本步驟,詳細的使用後面會慢慢提到。最後通過上面的代碼可以看到的運行效果如下:
另外,後文還會提供一些詳細的文檔和例子。比如:
rs_graphics
rs_core
rs_math
rs_time
上面這四個的標頭檔的API。
代碼可以在Android 4.0中找到,RenderScript->Helloworld。
註:模擬器無法運行。
摘自 Terry_龍