2013-01-25 24 views
2

的设定:甲RelativeLayout的与GLSurfaceView和作为图像中示出的按钮..传递指令,以渲染线程(GLSurfaceView)

enter image description here

问题:比方说我有其他三角形模型(图片中的模型是初始模型)...我希望通过单击按钮循环更改模型。由于按钮位于UI线程上,并且glSurfaceView在单独的线程上运行,所以我不完全知道如何将信息/指令传递给它。我知道有这个东西在Android中称为Handler可能在这种情况下是有用的......但我需要在这里一些帮助..

编辑:如果处理程序是正确的方式,我需要知道如何添加Looper该处理程序...该文档说在run()方法的开始处添加looper.prepare() ..但glSurfaceView隐式创建线程,导致没有run()方法直接可用..

回答

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; 
    } 

} 

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类中包含足够的局部变量来定义它们。

我希望我的回答有帮助,如果您有任何问题请告诉我。

Tim

0

你应该看看queueEvent!这是一个非常方便的方式将信息从UI线程传递给渲染器线程:

queueEvent(new Runnable(){ 
    @Override 
    public void run() { 
     mRenderer.method(); 
}});