GLSurfaceView und Renderer - Beginner

H

HarryPotter

Neues Mitglied
0
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
 
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.
 
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...
 
Hattest du den Eintrag für OpenGL2.0 in der Manifest.xml vorgenommen?
 
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
 

Ähnliche Themen

Laser5001
Antworten
3
Aufrufe
630
swa00
swa00
W
Antworten
2
Aufrufe
718
rene3006
R
S
Antworten
0
Aufrufe
578
Sergio13
S
Zurück
Oben Unten