2014-01-23 9 views
5

Grundsätzlich möchte ich SurfaceView für die Animation verwenden. Daher implementiert die Klasse Runnable. Um zu experimentieren, möchte ich einen Kreis zeichnen. Es zeigt jedoch nur einen schwarzen Bildschirm.SurfaceView zeigt schwarzen Bildschirm - Android

Ich habe seit Tagen versucht. Wirklich zu schätzen, wenn jemand helfen kann.

MainActivity Klasse

public class MainActivity extends Activity { 

private Bitmap Liquid; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    requestWindowFeature (Window.FEATURE_NO_TITLE); 
    getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, 
      WindowManager.LayoutParams.FLAG_FULLSCREEN); 

    DrawStripFrame D1 = new DrawStripFrame(this); 
    setContentView(D1); 

DrawStripFrame Klasse

public class DrawStripFrame extends SurfaceView implements Runnable{ 

private SurfaceHolder holder; 
private boolean running = true; 

public DrawStripFrame (Context context){ 
    super (context); 
    holder = getHolder(); 
} 

@Override 
public void run(){ 

     while(running){   
      if(holder.getSurface().isValid()){ 
       Canvas c = holder.lockCanvas(); 
       c.drawARGB(0, 0, 0, 0); 
       Paint redPaint = new Paint(); 
       redPaint.setColor(Color.RED); 
       c.drawCircle(100, 100, 30, redPaint); 
       holder.unlockCanvasAndPost(c); 
      } 

     } 
    } 
} 

Antwort

2

Das Problem wird durch die Änderung der while-Schleife wie folgt gelöst:

while(running){   
      if(!holder.getSurface().isValid()) 
       continue; 

      Canvas c = holder.lockCanvas(); 
      c.drawARGB(0, 0, 0, 0); 
      Paint redPaint = new Paint(); 
      redPaint.setColor(Color.RED); 
      c.drawCircle(100, 100, 30, redPaint); 
      holder.unlockCanvasAndPost(c); 
    } 

Die Aussage Kontrolle nach oben sendet weiter zurück der Schleife, wenn die Oberfläche ungültig ist. Nur wenn die Oberfläche gültig ist, wird der folgende Block ausgeführt.

+8

Ich verstehe es nicht. Dieser Code entspricht funktional dem in Ihrem ursprünglichen Post. Sie haben es im Grunde von "Wenn die Bedingung wahr ist, dann führen Sie diesen Code" zu "Wenn die Bedingung falsch ist, dann führen Sie diesen Code nicht aus". Verschiedene Möglichkeiten, dasselbe zu sagen. –

+1

diese beiden Aussagen sind nicht gleichwertig. A impliziert B ist nicht äquivalent zu nicht (A) impliziert nicht (B). – felamaslen

+0

'' 'A => B''' ist nicht gleichbedeutend mit' '' ¬A => B''', sicher. Aber in diesem Fall kann die zweite Aussage nicht formalisiert werden als '' '¬A =>' B'''. Wenn A (Oberfläche ist gültig) wahr ist, ist B (In Leinwand zeichnen) wahr; und wenn A falsch ist, ist B falsch. Es ist '' 'A => B''' in beiden Fällen. Wenn Sie sagen können, dass der zu zeichnende Code nicht in einem anderen Teil des Codes ausgeführt werden kann, ist das eine andere Geschichte. – JCarlos

1

Ich hatte das gleiche Problem. Ich habe meine APP auf verschiedenen Emulatoren getestet.

Das war meine MainActivity Klasse

import android.os.Bundle; 
import android.support.v7.app.AppCompatActivity; 

public class MainActivity extends AppCompatActivity { 

    private SurfaceViewTest test; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     test = new SurfaceViewTest(this); 
     setContentView(test); 
    } 

    @Override 
    protected void onResume() { 
     super.onResume(); 
     test.resume(); 
    } 
} 

SurfaceViewTest.java

import android.content.Context; 
import android.graphics.Canvas; 
import android.graphics.Color; 
import android.view.SurfaceView; 


public class SurfaceViewTest extends SurfaceView implements Runnable { 

    private Thread thread; 
    volatile boolean running; 


    public SurfaceViewTest(Context context) { 
     super(context); 
    } 
    @Override 
    public void run() { 
     while(running) { 
      draw(); 
     } 
    } 

    private void draw(){ 

     if(getHolder().getSurface().isValid()) { 
      Canvas canvas = getHolder().lockCanvas(); 

      canvas.drawColor(Color.argb(255, 255, 0, 0)); 

      getHolder().unlockCanvasAndPost(canvas); 
     } 
    } 

    public void resume() { 
     running = true; 
     thread = new Thread(this); 
     thread.start(); 
    } 

    public void pause() { 
     running = false; 

     while (thread.isAlive()) { 
      try { 
       thread.join(100); 

       if(thread.isAlive()) { 
        thread.interrupt(); 
        thread.join(); 
       } 
      } catch (InterruptedException e) { 
       e.printStackTrace(); 
      } 
     } 
    } 
} 

styles.xml

<resources> 

    <!-- Base application theme. --> 
    <style name="AppTheme" parent="Theme.AppCompat"> 
     <!-- Customize your theme here. --> 
     <item name="colorPrimary">@color/colorPrimary</item> 
     <item name="colorPrimaryDark">@color/colorPrimaryDark</item> 
     <item name="colorAccent">@color/colorAccent</item> 
     <item name="android:windowFullscreen">true</item> 
    </style> 

    <style name="Theme.AppCompat.Light.NoActionBar.FullScreen" parent="@style/Theme.AppCompat.Light"> 
     <item name="windowNoTitle">true</item> 
     <item name="windowActionBar">false</item> 
     <item name="android:windowFullscreen">true</item> 
     <item name="android:windowContentOverlay">@null</item> 
     <item name="android:background">#000000</item><!-- Remove it to fix the problem --> 
    </style> 
</resources> 

Ich löste es das Element Hintergrund von styles.xml Entfernen

<item name="android:background">#00000</item> 

Es sieht ein Problem mit dem Alphakanal aus.