2012-02-17 5 views
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つの解決策の違いを教えてください。

感謝:)

答えて

2

あなたは空onDrawFrame()メソッドを持っている最初のソリューションで。これはおそらくそれが動作していない理由です。 GLSurfaceView.Renderer

+2

ああ。本当にありがとう。この例では、onResumeとonDrawFrameの違いを教えてください。 Androidは常にonResumeにonDrawFrameとして実行されると思うからです。ありがとう:) – hqt

+0

onResumeがトリガされると、これはGLSurfaceViewにonDrawFrame()の呼び出しを何度も繰り返し始めるように指示します。最初のメソッドはonDrawFrame関数で何もしないので、何も描画されません。 onResume関数で持っている描画コードをonDrawFrame()に入れると、そのコードは機能し始めます。注記onResumeは少なくとも、別のライフサイクルイベントがそれに戻って(ログして参照する)サイクル変更を引き起こすまで、一度だけ呼び出されます。アンドロイドライフサイクルの詳細については、[アクティビティライフサイクル](http://developer.android.com/reference/android/app/Activity.html#ActivityLifecycle)をご覧ください。 – Maz

関連する問題