随时随地阅读更多技术实战干货,获取项目源码、学习资料,请关注源代码社区公众号(ydmsq666)
RSSurfaceView直接继承自SurfaceView,实现了SurfaceHolder.Callback回调接口。解析如下:
1、 构造方法1
public RSSurfaceView(Context context) {
super(context);
init();
//Log.v(RenderScript.LOG_TAG, "RSSurfaceView");
}
2、构造方法2
public RSSurfaceView(Context context, AttributeSet attrs) {
super(context, attrs);
init();
//Log.v(RenderScript.LOG_TAG, "RSSurfaceView");
}
3、初始化:增加回调,以便当surface被创建和摧毁时能收到通知。
private void init() {
// Install a SurfaceHolder.Callback so we get notified when the
// underlying surface is created and destroyed
SurfaceHolder holder = getHolder();
holder.addCallback(this);
}
4、创建时的回调
public void surfaceCreated(SurfaceHolder holder) {
mSurfaceHolder = holder;
}
5、摧毁时的回调
public void surfaceDestroyed(SurfaceHolder holder) {
synchronized (this) {
// Surface will be destroyed when we return
if (mRS != null) {
mRS.setSurface(null, 0, 0);
}
}
}
6、改变时的回调
public void surfaceChanged(SurfaceHolder holder, int format, int w, int h) {
synchronized (this) {
if (mRS != null) {
mRS.setSurface(holder, w, h);
}
}
}
7、暂停:通知该View当前activity已经暂停了,当activity被暂停时必须调用改方法,调用此方法将暂停渲染线程,必须在渲染器设置之后才能调用。
public void pause() {
if(mRS != null) {
mRS.pause();
}
}
8、恢复:通知此View当前activity已经恢复了,当activity恢复时必须调用此方法去重新创建OpenGL展示,和恢复渲染线程;必须在渲染器设置之后才能调用。
public void resume() {
if(mRS != null) {
mRS.resume();
}
}
9、创建RenderScriptGL
public RenderScriptGL createRenderScriptGL(RenderScriptGL.SurfaceConfig sc) {
RenderScriptGL rs = new RenderScriptGL(this.getContext(), sc);
setRenderScriptGL(rs);
return rs;
}
10、摧毁当前的RenderScriptGL
public void destroyRenderScriptGL() {
synchronized (this) {
mRS.destroy();
mRS = null;
}
}
11、设置RenderScriptGL
public void setRenderScriptGL(RenderScriptGL rs) {
mRS = rs;
}
12、获取当前RenderScriptGL
public RenderScriptGL getRenderScriptGL() {
return mRS;
}
附上源码:
package android.renderscript;
import java.io.Writer;
import java.util.ArrayList;
import java.util.concurrent.Semaphore;
import android.content.Context;
import android.os.Handler;
import android.os.Message;
import android.util.AttributeSet;
import android.util.Log;
import android.view.Surface;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
/**
* @deprecated in API 16
* The Surface View for a graphics renderscript (RenderScriptGL) to draw on.
*
* <div class="special reference">
* <h3>Developer Guides</h3>
* <p>For more information about creating an application that uses Renderscript, read the
* <a href="{@docRoot}guide/topics/graphics/renderscript.html">Renderscript</a> developer guide.</p>
* </div>
*/
public class RSSurfaceView extends SurfaceView implements SurfaceHolder.Callback {
private SurfaceHolder mSurfaceHolder;
private RenderScriptGL mRS;
/**
* @deprecated in API 16
* Standard View constructor. In order to render something, you
* must call {@link android.opengl.GLSurfaceView#setRenderer} to
* register a renderer.
*/
public RSSurfaceView(Context context) {
super(context);
init();
//Log.v(RenderScript.LOG_TAG, "RSSurfaceView");
}
/**
* @deprecated in API 16
* Standard View constructor. In order to render something, you
* must call {@link android.opengl.GLSurfaceView#setRenderer} to
* register a renderer.
*/
public RSSurfaceView(Context context, AttributeSet attrs) {
super(context, attrs);
init();
//Log.v(RenderScript.LOG_TAG, "RSSurfaceView");
}
private void init() {
// Install a SurfaceHolder.Callback so we get notified when the
// underlying surface is created and destroyed
SurfaceHolder holder = getHolder();
holder.addCallback(this);
}
/**
* @deprecated in API 16
* This method is part of the SurfaceHolder.Callback interface, and is
* not normally called or subclassed by clients of RSSurfaceView.
*/
public void surfaceCreated(SurfaceHolder holder) {
mSurfaceHolder = holder;
}
/**
* @deprecated in API 16
* This method is part of the SurfaceHolder.Callback interface, and is
* not normally called or subclassed by clients of RSSurfaceView.
*/
public void surfaceDestroyed(SurfaceHolder holder) {
synchronized (this) {
// Surface will be destroyed when we return
if (mRS != null) {
mRS.setSurface(null, 0, 0);
}
}
}
/**
* @deprecated in API 16
* This method is part of the SurfaceHolder.Callback interface, and is
* not normally called or subclassed by clients of RSSurfaceView.
*/
public void surfaceChanged(SurfaceHolder holder, int format, int w, int h) {
synchronized (this) {
if (mRS != null) {
mRS.setSurface(holder, w, h);
}
}
}
/**
* @deprecated in API 16
* Inform the view that the activity is paused. The owner of this view must
* call this method when the activity is paused. Calling this method will
* pause the rendering thread.
* Must not be called before a renderer has been set.
*/
public void pause() {
if(mRS != null) {
mRS.pause();
}
}
/**
* @deprecated in API 16
* Inform the view that the activity is resumed. The owner of this view must
* call this method when the activity is resumed. Calling this method will
* recreate the OpenGL display and resume the rendering
* thread.
* Must not be called before a renderer has been set.
*/
public void resume() {
if(mRS != null) {
mRS.resume();
}
}
/**
* @deprecated in API 16
**/
public RenderScriptGL createRenderScriptGL(RenderScriptGL.SurfaceConfig sc) {
RenderScriptGL rs = new RenderScriptGL(this.getContext(), sc);
setRenderScriptGL(rs);
return rs;
}
/**
* @deprecated in API 16
**/
public void destroyRenderScriptGL() {
synchronized (this) {
mRS.destroy();
mRS = null;
}
}
/**
* @deprecated in API 16
**/
public void setRenderScriptGL(RenderScriptGL rs) {
mRS = rs;
}
/**
* @deprecated in API 16
**/
public RenderScriptGL getRenderScriptGL() {
return mRS;
}
}