1. Nimm jetzt an unserem Uhans - 3. ADVENT - Gewinnspiel teil - Alle Informationen findest Du hier!

GLSurfaceView und Renderer - Beginner

Dieses Thema im Forum "Android App Entwicklung" wurde erstellt von HarryPotter, 10.05.2012.

  1. HarryPotter, 10.05.2012 #1
    HarryPotter

    HarryPotter Threadstarter Neuer Benutzer

    Beiträge:
    3
    Erhaltene Danke:
    0
    Registriert seit:
    10.05.2012
    N'abend Leute,

    Ich möchte eine App programmieren.

    Das Ziel ist: Man tippt auf den Touchscreen und an dieser Stelle leuchtet ein (grüner) Punkt oder Kreis auf. Ob der Punkt danach verschwindet oder erhalten bleibt ist mir zunächst egal.

    Ich versuche das mit drei Klassen, einer Activity, GLSurfaceView und einer Renderer Klasse zu implementieren.

    Wenn ich das ausführe, dann kann ich ca. 10 Sekunden auf der schwarzen Fläche rumklicken und dann kommt die Meldung das die App nicht mehr reagiert. Im LOG kommen viele Fehlermeldungen:


    Ich poste jetzt den Code.

    Code für Activity (1.Klasse):

    Code:
    import android.app.Activity;
    import android.opengl.GLSurfaceView;
    import android.os.Bundle;
    import android.util.Log;
    import android.widget.TextView;
    
    public class HelloAndroidActivity extends Activity {
    	
    	private MyGLSurfaceView glSurface;
    	
    	
    	
        /** Called when the activity is first created. */
        @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            glSurface  = new MyGLSurfaceView(this);
            setContentView(glSurface);
        }
       
    }
    
    Code für GLSurfaceView (2.Klasse):
    Code:
    import android.content.Context;
    import android.graphics.Canvas;
    import android.opengl.GLSurfaceView;
    import android.view.KeyEvent;
    import android.view.MotionEvent;
    import android.view.SurfaceHolder;
    
    class MyGLSurfaceView extends GLSurfaceView implements SurfaceHolder.Callback {
    
    	private MyRenderer mMyRenderer;
    	
        public MyGLSurfaceView(Context context) {
    		super(context);
    		start();
    	}
    
        public void start() {
        	SurfaceHolder holder = getHolder();
            holder.addCallback(this);
            mMyRenderer = new MyRenderer(holder);
            setRenderer(mMyRenderer);
        }
    
        
       @Override
    public boolean onTouchEvent(MotionEvent event) {
    	// TODO Auto-generated method stub
    	   int eventaction = event.getAction();
    
    	   float x = event.getX();
           float y = event.getY();
    	   
    	    switch (eventaction) {
    	        case MotionEvent.ACTION_DOWN: 
    	            mMyRenderer.drawPoint(x,y);
    	    }
    	return super.onTouchEvent(event);
       }
       
    }
    
    und die Renderer Klasse (3.Klasse):
    Code:
    import javax.microedition.khronos.egl.EGLConfig;
    import javax.microedition.khronos.opengles.GL10;
    
    
    import android.graphics.Canvas;
    import android.graphics.Color;
    import android.graphics.Paint;
    import android.opengl.GLSurfaceView.Renderer;
    import android.view.SurfaceHolder;
    
    public class MyRenderer implements Renderer {
    
    	private SurfaceHolder mSurfaceHolder;
    	private Paint p;
    	 /** Indicate whether the surface has been created & is ready to draw */
        private boolean mRun = false;
        
    	public MyRenderer(SurfaceHolder sf){
    		mSurfaceHolder = sf;
    		p = new Paint();
    		p.setColor(Color.GREEN);
    	}
    	
    	public void onDrawFrame(GL10 gl) {
    		
    	}
    
    	public void onSurfaceChanged(GL10 gl, int width, int height) {
    		// TODO Auto-generated method stub
    		
    	}
    
    	public void onSurfaceCreated(GL10 gl, EGLConfig config) {
    		// TODO Auto-generated method stub
    		
    	}
    
    	public void drawPoint(float x, float y){
    		Canvas mc = null;
    		while(mc==null){
    		System.out.println("OK<<<<<<<<<<<<<<<<<<<<<<<<<<<BLA");
            try {
                mc = mSurfaceHolder.lockCanvas(null);
                if (mc!=null){
                synchronized (mSurfaceHolder) {
                    mc.drawCircle(x, y, 100, p);
                }
            }
            }
            catch ( Exception e )  // Exception
            {
              System.out.println( "Datei gibt’s nicht!" );
            }
    		}
    		mSurfaceHolder.unlockCanvasAndPost(mc);
    		}
    	}
    
    Wenn das Problem zu konfus beschrieben ist , oder das Problem zu einfach ist dann sagt es mir, dass würde mir schon helfen.

    MFG HP
     
  2. strider, 10.05.2012 #2
    strider

    strider Erfahrener Benutzer

    Beiträge:
    208
    Erhaltene Danke:
    45
    Registriert seit:
    30.09.2011
    Phone:
    Nexus S
    Was mir sofort ins Auge fällt ist, dass Du in onTouchEvent nicht true zurücklieferst wenn du den event verarbeitest, das wäre schon mal ein Punkt. Den logcat solltest du posten, nur darin steht der Fehler.
     
  3. HarryPotter, 12.05.2012 #3
    HarryPotter

    HarryPotter Threadstarter Neuer Benutzer

    Beiträge:
    3
    Erhaltene Danke:
    0
    Registriert seit:
    10.05.2012
    Danke erstmal für die Antwort.

    DAS LOGCAT:
    Code:
    05-12 11:43:28.690: E/SurfaceHolder(1400): Exception locking surface
    05-12 11:43:28.690: E/SurfaceHolder(1400): java.lang.IllegalArgumentException
    05-12 11:43:28.690: E/SurfaceHolder(1400): 	at android.view.Surface.lockCanvasNative(Native Method)
    05-12 11:43:28.690: E/SurfaceHolder(1400): 	at android.view.Surface.lockCanvas(Surface.java:76)
    05-12 11:43:28.690: E/SurfaceHolder(1400): 	at android.view.SurfaceView$4.internalLockCanvas(SurfaceView.java:744)
    05-12 11:43:28.690: E/SurfaceHolder(1400): 	at android.view.SurfaceView$4.lockCanvas(SurfaceView.java:720)
    05-12 11:43:28.690: E/SurfaceHolder(1400): 	at bla.dot.android.MyRenderer.onSurfaceCreated(MyRenderer.java:40)
    05-12 11:43:28.690: E/SurfaceHolder(1400): 	at android.opengl.GLSurfaceView$GLThread.guardedRun(GLSurfaceView.java:1446)
    05-12 11:43:28.690: E/SurfaceHolder(1400): 	at android.opengl.GLSurfaceView$GLThread.run(GLSurfaceView.java:1216)
    
    
    Aber ich habe in der Refernz gelesen das der emulator noch nicht OpenGL ES2.0 unterstützt. Daher wird das Projekt mal auf die lange Bank geschoben. Ich knüpfe aber hier wieder daran an wenn ich was anderes gemacht habe. Ich will es jetzt mal mit OpenGL Es1.0 probieren...
     
  4. Zanny, 22.05.2012 #4
    Zanny

    Zanny Neuer Benutzer

    Beiträge:
    6
    Erhaltene Danke:
    0
    Registriert seit:
    30.03.2012
    Hattest du den Eintrag für OpenGL2.0 in der Manifest.xml vorgenommen?
     
  5. HarryPotter, 22.05.2012 #5
    HarryPotter

    HarryPotter Threadstarter Neuer Benutzer

    Beiträge:
    3
    Erhaltene Danke:
    0
    Registriert seit:
    10.05.2012
    Hallo,

    Nein ich habe die manifest.xml nicht angefasst. Ich wusste gar nicht das man das machen muss.
    Danke für den Tip ich werde es mal ausprobieren.

    Nur noch mal als Anmerkung an Alle, der Code den ich im ersten post gepostet habe stammt im wesentlichen (mit Änderungen) vom LunarLander.

    Schönen Tag noch
     

Diese Seite empfehlen