2014-01-23 3 views
5

В основном я хочу использовать SurfaceView для анимации. Поэтому класс реализует Runnable. Чтобы экспериментировать, я хочу нарисовать круг. Тем не менее, он показывает только черный экран.SurfaceView показывает черный экран - Android

Я пытался в течение нескольких дней. Очень ценю, если кто-то может помочь.

класс 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); 

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

     } 
    } 
} 

ответ

2

Поставленная задача решается за счет изменения время цикла, как это:

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

Продолжить заявление посылает управление обратно к началу петли, когда поверхность недействительна. Только когда поверхность будет действительна, будет выполнен блок ниже.

+8

Я не понимаю. Этот код функционально эквивалентен этому в вашем исходном сообщении. Вы в основном изменили его с «if condition is true then run this code» на «if condition is false, а затем не запускайте этот код». Различные способы сказать одно и то же. –

+1

эти два утверждения не эквивалентны. A означает, что B не эквивалентен не (A), а не (B). – felamaslen

+0

'' 'A => B''' не является эквивалентом' '' ¬A => ¬B''', конечно. Но в этом случае второй оператор не может быть формализован как '' '¬A => ¬B'''. Когда A (Поверхность действительна) истинна, B (Draw in canvas) истинно; и когда A является ложным, B является ложным. В обоих случаях это '' 'A => B'''. Если вы можете сказать, что код для рисования не может быть выполнен в другой части кода, это еще одна история. – JCarlos

1

У меня была эта проблема. Я тестировал свой APP на разных эмуляторах.

Это был мой 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> 

Я решил его удаления фона элемента из styles.xml

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

Это проблема с альфа-каналом.

Смежные вопросы