1
Renderer
の2通りの方法で三角形を描画します。 1つは仕事であり、1つはなしです。Android:レンダラーの異なる2つの使用
ここに私の2つの解決策があります。
最初の解決策:実行時には動作しません。私はRenderer
は(あなたがライン表示されるはずです。:glView.setRenderer
方法を私の2つのソリューションの基本的な違いということ。)emplements
package com.test;
import java.nio.ByteBuffer;
import java.nio.ByteOrder;
import java.nio.FloatBuffer;
import javax.microedition.khronos.egl.EGLConfig;
import javax.microedition.khronos.opengles.GL10;
import android.app.Activity;
import android.opengl.GLSurfaceView;
import android.opengl.GLSurfaceView.Renderer;
import android.os.Bundle;
public class TriangleOpenGLTest extends Activity implements Renderer{
FloatBuffer vertices;
ByteBuffer byteBuffer;
GL10 gl;
GLSurfaceView glView;
@Override
public void onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
byteBuffer = ByteBuffer.allocateDirect(3*2*4);
byteBuffer.order(ByteOrder.nativeOrder());
vertices = byteBuffer.asFloatBuffer();
vertices.put(new float[] { 0.0f, 0.0f, 319.0f, 0.0f, 160.0f, 479.0f});
vertices.flip();
glView = new GLSurfaceView(this);
glView.setRenderer(this);
setContentView(glView);
}
@Override
public void onResume(){
super.onResume();
gl.glViewport(0, 0, glView.getWidth(), glView.getHeight());
gl.glClear(GL10.GL_COLOR_BUFFER_BIT);
gl.glMatrixMode(GL10.GL_PROJECTION);
gl.glLoadIdentity();
gl.glOrthof(0, 320, 0, 480, 1, -1);
gl.glColor4f(1, 0, 0, 1);
gl.glEnableClientState(GL10.GL_VERTEX_ARRAY);
gl.glVertexPointer(2, GL10.GL_FLOAT, 0, vertices);
gl.glDrawArrays(GL10.GL_TRIANGLES, 0, 3);
}
@Override
public void onDrawFrame(GL10 gl) {
}
@Override
public void onSurfaceChanged(GL10 gl, int width, int height) {
}
@Override
public void onSurfaceCreated(GL10 gl, EGLConfig config) {
}
}
解決策2:私は私のレンダラのための新たなサブクラスを作成します。
package com.test;
import java.nio.ByteBuffer;
import java.nio.ByteOrder;
import java.nio.FloatBuffer;
import javax.microedition.khronos.egl.EGLConfig;
import javax.microedition.khronos.opengles.GL10;
import android.app.Activity;
import android.opengl.GLSurfaceView;
import android.opengl.GLSurfaceView.Renderer;
import android.os.Bundle;
public class TriangleOpenGLTest extends Activity {
FloatBuffer vertices;
ByteBuffer byteBuffer;
GL10 gl;
GLSurfaceView glView;
@Override
public void onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
byteBuffer = ByteBuffer.allocateDirect(3*2*4);
byteBuffer.order(ByteOrder.nativeOrder());
vertices = byteBuffer.asFloatBuffer();
vertices.put(new float[] { 0.0f, 0.0f, 319.0f, 0.0f, 160.0f, 479.0f});
vertices.flip();
glView = new GLSurfaceView(this);
glView.setRenderer(new DrawTriangle());
setContentView(glView);
}
@Override
public void onResume(){
super.onResume();
}
public class DrawTriangle implements Renderer{
public DrawTriangle(){
}
@Override
public void onDrawFrame(GL10 gl) {
gl.glViewport(0, 0, glView.getWidth(), glView.getHeight());
gl.glClear(GL10.GL_COLOR_BUFFER_BIT);
gl.glMatrixMode(GL10.GL_PROJECTION);
gl.glLoadIdentity();
gl.glOrthof(0, 320, 0, 480, 1, -1);
gl.glColor4f(1, 0, 0, 1);
gl.glEnableClientState(GL10.GL_VERTEX_ARRAY);
gl.glVertexPointer(2, GL10.GL_FLOAT, 0, vertices);
gl.glDrawArrays(GL10.GL_TRIANGLES, 0, 3);
}
@Override
public void onSurfaceChanged(GL10 gl, int width, int height) {
// TODO Auto-generated method stub
}
@Override
public void onSurfaceCreated(GL10 gl, EGLConfig config) {
// TODO Auto-generated method stub
}
}
}
上記の2つの解決策の違いを教えてください。
感謝:)
ああ。本当にありがとう。この例では、onResumeとonDrawFrameの違いを教えてください。 Androidは常にonResumeにonDrawFrameとして実行されると思うからです。ありがとう:) – hqt
onResumeがトリガされると、これはGLSurfaceViewにonDrawFrame()の呼び出しを何度も繰り返し始めるように指示します。最初のメソッドはonDrawFrame関数で何もしないので、何も描画されません。 onResume関数で持っている描画コードをonDrawFrame()に入れると、そのコードは機能し始めます。注記onResumeは少なくとも、別のライフサイクルイベントがそれに戻って(ログして参照する)サイクル変更を引き起こすまで、一度だけ呼び出されます。アンドロイドライフサイクルの詳細については、[アクティビティライフサイクル](http://developer.android.com/reference/android/app/Activity.html#ActivityLifecycle)をご覧ください。 – Maz