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

Auf SurfaceView zeichnen

Dieses Thema im Forum "Android App Entwicklung" wurde erstellt von Sabbert, 30.04.2012.

  1. Sabbert, 30.04.2012 #1
    Sabbert

    Sabbert Threadstarter Neuer Benutzer

    Beiträge:
    3
    Erhaltene Danke:
    0
    Registriert seit:
    29.04.2012
    Guten Tag zusammen,

    Ich versuche auf einem SurfaceView via Canvas zu zeichnen, jodoch ohne erfolg bis jetzt.

    Wenn ich die App starte bleibt Sie einfach schwarz und nichts passiert.

    Ich habe versucht eine SurfaceView und einen Thread zu erstellen, der alle 50ms den SurfaceView neu zu zeichnen.
    Als Test soll einfach nur ein Kreis gezeichnet werden.

    Beim Start der App setzte ich vie setContentView(View) auf das SurfaceView um.

    Code:
    package de.surface.test;
    
    import android.app.Activity;
    import android.os.Bundle;
    
    public class SurfaceTestActivity extends Activity {
        /** Called when the activity is first created. */
        @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            
            DrawView view = new DrawView(this);
            
            setContentView(view);
        }
    }
    
    Code:
    package de.surface.test;
    
    import android.content.Context;
    import android.graphics.Canvas;
    import android.view.SurfaceHolder;
    import android.view.SurfaceHolder.Callback;
    import android.view.SurfaceView;
    
    public class DrawView extends SurfaceView implements Callback {
        private SurfaceHolder holder;
        private Canvas canvas;
        
        public DrawView(Context context) {
            super(context);
            holder = this.getHolder();
            holder.addCallback(this);
            draw();
        }
    
        public void surfaceChanged(SurfaceHolder holder, int format, int width,    int height) {
            
        }
        public void surfaceCreated(SurfaceHolder holder) {
            
        }
        public void surfaceDestroyed(SurfaceHolder holder) {
            
        }
        
        private void draw() {
            new Thread() {
                public void run() {
                    canvas = holder.lockCanvas();
                    if(canvas != null) {
                        try {
                            canvas.drawCircle(50, 50, 50, null);
                        } finally {
                            holder.unlockCanvasAndPost(canvas);
                        }                
                    }
                    
                    try {
                        Thread.sleep(50);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }   
                }
            };
        }    
    }
    
    Ich hoffe ihr könnt mir helfen oder Tipps geben :)

    lg
     
  2. strider, 30.04.2012 #2
    strider

    strider Erfahrener Benutzer

    Beiträge:
    208
    Erhaltene Danke:
    45
    Registriert seit:
    30.09.2011
    Phone:
    Nexus S
    Also wenn ich das machen dann sehe ich ganz klar einen Kreis mit der Farbe null auf meinem Display, funktioniert 1A. :)
     
  3. Sabbert, 30.04.2012 #3
    Sabbert

    Sabbert Threadstarter Neuer Benutzer

    Beiträge:
    3
    Erhaltene Danke:
    0
    Registriert seit:
    29.04.2012
    Jetzt ehrlich oO :D
    Also ich benutze den Android Emulator in Eclipse, da ich zurzeit kein Testgerät zur Hand habe könnte es daran liegen?!

    Also bei mir passiert einfach nichts...
     
  4. strider, 30.04.2012 #4
    strider

    strider Erfahrener Benutzer

    Beiträge:
    208
    Erhaltene Danke:
    45
    Registriert seit:
    30.09.2011
    Phone:
    Nexus S
    Ich hab mich da etwas unpräzise ausgedrückt sorry.
    Was ich meinte war:
    canvas.drawCircle(50, 50, 50, null);
    Du brauchst ein Paint wenn du was sehen willst und nicht 'null'.
     
    Zuletzt bearbeitet: 30.04.2012
  5. Sabbert, 30.04.2012 #5
    Sabbert

    Sabbert Threadstarter Neuer Benutzer

    Beiträge:
    3
    Erhaltene Danke:
    0
    Registriert seit:
    29.04.2012
    So erstmal ein dickes Danke für deine Hilfe ;-)
    Habs endlich hinbekommen :D

    Hattest recht da fehlte das Paint :D. Und außerdem hatte ich vergessen den Thread zu starten. :D

    Hier der Code:
    Code:
    package de.surface.test;
    
    import android.content.Context;
    import android.graphics.Canvas;
    import android.graphics.Color;
    import android.graphics.Paint;
    import android.view.SurfaceHolder;
    import android.view.SurfaceHolder.Callback;
    import android.view.SurfaceView;
    
    public class DrawView extends SurfaceView implements Callback {
        private SurfaceHolder holder;
        private Canvas canvas;
        private Paint paint;
        private Thread th;
        private boolean isRunning = false;
        
        public DrawView(Context context) {
            super(context);
            init();        
        }
        
        public void init(){
            
            holder = this.getHolder();
            holder.addCallback(this);
            paint = new Paint();
            paint.setColor(Color.WHITE);       
            
            //Thread zum Zeichnen
            new Thread(new Runnable() { 
                public void run(){                 
                    while(isRunning)
                    {
                        draw(canvas);
                        try{
                            Thread.sleep(50);
                        } catch (InterruptedException e){}
                    }         
                 
                }
            }).start();
            
            isRunning = true;
        }
        
        public void surfaceChanged(SurfaceHolder holder, int format, int width,    int height) {
            
        }
        public void surfaceCreated(SurfaceHolder holder) {
            
        }
        public void surfaceDestroyed(SurfaceHolder holder) {
            
        }
        
        public void draw(Canvas c) {     
            c = holder.lockCanvas();
            if(c != null) {
                       
                c.drawColor(Color.GREEN);
                c.drawCircle(50, 50, 50, paint);                        
                        
                holder.unlockCanvasAndPost(c);
            }
                                      
        }
    }
    
     
  6. number8, 01.05.2013 #6
    number8

    number8 Neuer Benutzer

    Beiträge:
    1
    Erhaltene Danke:
    0
    Registriert seit:
    01.05.2013
    Hallo zusammen.
    Ich wollt wegen meines Problem nicht einen neuen Thread aufmachen, von daher...
    Auch bei mir bleibt der Screen im Surfaceview schwarz. Aber ich habe zwei Activities. Activity1 bekommt als content ein layout-xml-file und navigiert zu Activity2, welche ich so wie in

    Android Game Programming 3

    aufgebaut habe. Der Thread läuft (logging in onDraw) aber es ist eben alles schwarz.

    Eine Seite davor im Tutorial wird noch kein Thread verwendet. Da wird das Bitmap noch korrekt gezeichnet.
    Hat wer eine Idee?
    Vielen Dank.
     

Diese Seite empfehlen