设置:具有GLSurfaceView和按钮的RelativeLayout,如图所示..
问题:让我说我有其他三角模型(图片中的那个是初始模型)...我希望在点击按钮时循环更改模型。由于按钮位于UI线程上并且glSurfaceView在单独的线程上运行,因此我并不完全知道如何将信息/指令传递给它。我知道Android中有一个名为Handler的东西,在这种情况下可能很有用......但我需要一些帮助......
修改:如果Handler是正确的方式,我需要知道如何将Looper添加到该处理程序...文档说明在开头添加looper.prepare()
run()方法..但glSurfaceView隐式创建线程,导致没有run()方法直接可用..
答案 0 :(得分:4)
我认为没有必要使用处理程序来解决此问题,但您可能需要调整组织课程的方式。
以下是可能解决您问题的组织结构示例:
活动类
public class MainActivity extends Activity {
private int modelNumber = 0;
private ArrayList<Model> models = new ArrayList<Model>();
private YourRendererClass renderer;
@Override
public void onCreate(Bundle savedInstanceState) {
...
// Setup GLSurfaceView
GLSurfaceView surface = new GLSurfaceView(this);
setContentView(surface);
renderer = new YourRendererClass();
surface.setRenderer(renderer);
// Set up models
models.add(new Model(x, y, size etc..));
models.add(new Model(x, y, size etc..));
models.add(new Model(x, y, size etc..));
etc.
// Display first model
renderer.setCurrentModel(models.get(modelNumber));
...
}
// Called by the button press:
// Use android:onClick="onClick"
// in your layout xml file within button
public void onClick(View view){
// Make it loop round
modelNumber++;
if(modelNumber>=models.size()){
modelNumber=0;
}
// Display current model
renderer.setCurrentModel(models.get(modelNumber));
}
}
渲染器类
public class YourRendererClass implements Renderer {
private Model currentModel;
@Override
public void onDrawFrame(GL10 gl) {
// ** Your existing set-up code **//
// Draw model
if (currentModel!=null){
currentModel.draw(gl);
}
}
public void setCurrentModel(Model model){
currentModel = model;
}
}
模型类
public class Model {
// Holds model information
private int size;
private int x;
private int y;
// etc...
public model(int x, int y, int size etc...){
this.x=x;
this.y=y;
this.size=size;
// etc....
}
public void draw(GL10 gl) {
// ** Draw model based on model information fields above **
}
}
上面的代码未经测试,因为我无法访问您的绘图代码,但如果正确实施,结构应该可以正常工作。我已经尝试明确说明您必须插入自己的代码才能使其正常工作。特别是我不确定是什么定义了每个不同的模型,所以你需要在Model类中包含足够的局部变量来定义它们。
我希望我的回答有所帮助,如果您有任何问题,请与我联系。
添
答案 1 :(得分:1)
你应该看看queueEvent!这是将信息从UI线程传递到渲染器线程的非常方便的方法:
queueEvent(new Runnable(){
@Override
public void run() {
mRenderer.method();
}});