Я надеюсь, что у меня будет представление OpenGL (GLSurfaceView), которое использует Renderer вместе с некоторыми кнопками в RelativeLayout, чтобы каждая из этих кнопок могла взаимодействовать с визуализированным представлением.
Допустим, в этом RelativeLayout у меня есть один GLSurfaceView и одна кнопка под ним, которая при нажатии изменит GLSurfaceView на случайный сплошной цвет. Я понимаю, как рисовать в OpenGL, но я не понимаю, как взаимодействовать с рендерингом извне, чтобы поверхность могла изменяться пользовательским вводом, не связанным с событием касания в самом представлении.
Из моего исследования я предполагаю, что мне понадобится какой-нибудь поток, и мне может понадобиться метод queueEvent (Runnable). Не уверен, куда идти отсюда.
XML (main.xml)
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/RL1"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
>
<android.opengl.GLSurfaceView
android:id="@+id/GLView"
android:layout_width="200dip"
android:layout_height="200dip"
android:layout_centerHorizontal="true"
/>
<Button
android:id="@+id/Button1"
android:layout_width="150dip"
android:layout_height="100dip"
android:text="Click."
android:layout_below="@id/GLView"
android:layout_centerHorizontal="true"
/>
Activity (Basic.java)
import android.app.Activity;
import android.opengl.*;
import android.os.Bundle;
public class Basic extends Activity {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
GLSurfaceView glView = (GLSurfaceView)findViewById(R.id.GLView);
glView.setRenderer(new BasicRenderer(this));
}
}
Renderer (OpenGLRenderer.java)
import javax.microedition.khronos.egl.EGLConfig;
import javax.microedition.khronos.opengles.GL10;
import android.content.Context;
import android.opengl.GLU;
import android.opengl.GLSurfaceView.Renderer;
public class BasicRenderer implements Renderer {
private Context mContext;
private float mWidth, mHeight;
public BasicRenderer(Context context){
mContext=context;
}
@Override
public void onDrawFrame(GL10 gl) {
gl.glClear(GL10.GL_COLOR_BUFFER_BIT |
GL10.GL_DEPTH_BUFFER_BIT);
}
@Override
public void onSurfaceChanged(GL10 gl, int width, int height) {
mWidth = (float)width;
mHeight = (float)height;
gl.glViewport(0, 0, width, height);
gl.glMatrixMode(GL10.GL_PROJECTION);
gl.glLoadIdentity();
GLU.gluPerspective(gl, 45.0f,
(float) width / (float) height,
0.1f, 100.0f);
gl.glMatrixMode(GL10.GL_MODELVIEW);
gl.glLoadIdentity();
}
@Override
public void onSurfaceCreated(GL10 gl, EGLConfig config) {
// Set the background color to white
gl.glClearColor(1f, 1f, 1f, 0.5f);
gl.glShadeModel(GL10.GL_SMOOTH);
gl.glClearDepthf(1.0f);
gl.glEnable(GL10.GL_DEPTH_TEST);
gl.glDepthFunc(GL10.GL_LEQUAL);
gl.glHint(GL10.GL_PERSPECTIVE_CORRECTION_HINT,
GL10.GL_NICEST);
}
}