2

セットアップ:画像に示すように、GLSurfaceView とボタンを含む RelativeLayout..

ここに画像の説明を入力

問題:他の三角形モデルがあるとしましょう (写真のモデルは最初のモデルです)... ボタンのクリックでモデルを周期的に変更したいと考えています。ボタンは UI スレッド上にあり、glSurfaceView は別のスレッドで実行されるため、情報/命令を渡す方法が正確にはわかりません。この場合に役立つ可能性がある Android の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 スレッドからレンダラー スレッドに情報を渡す非常に便利な方法です。

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