SurfaceView muestra pantalla en negro – Android

Básicamente quiero usar SurfaceView para la animación. Por lo tanto la clase implementa Runnable. Para experimentar, quiero dibujar un círculo. Sin embargo, sólo muestra una pantalla en negro.

He estado intentando por días. Realmente apreciar si alguien puede ayudar.

Clase MainActivity

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); 

Clase DrawStripFrame

 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); } } } } 

El problema se resuelve cambiando el bucle while así:

 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); } 

La instrucción continue devuelve el control a la parte superior del bucle cuando la superficie no es válida. Sólo cuando la superficie sea válida, se ejecutará el bloque siguiente.

Yo tuve el mísmo problema. He probado mi APP en emuladores diferentes.

Esta era mi clase MainActivity

 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> 

Lo solucioné quitando el fondo del artículo de styles.xml

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

Parece un problema con el canal alfa.

  • Android IllegalArgumentException lockCanvas ()
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.