2

设置:如图所示,带有 GLSurfaceView 和按钮的 RelativeLayout。

在此处输入图像描述

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

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

4

2 回答 2

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

希望我的回答对你有帮助,有什么问题可以私信我。

蒂姆

于 2013-03-12T10:20:59.800 回答
2

你应该看看 queueEvent!这是将信息从 UI Thread 传递到渲染器 Thread 的一种非常方便的方法:

queueEvent(new Runnable(){
    @Override
    public void run() {
        mRenderer.method();
}});
于 2016-06-09T09:29:16.393 回答