SurfaceView shows black screen - Android

后端 未结 5 1611
情话喂你
情话喂你 2020-12-19 04:55

Basically I want to use SurfaceView for animation. Therefore the class implements Runnable. To experiment, I want to draw a circle. However, it shows only a black screen.

相关标签:
5条回答
  • 2020-12-19 05:10

    At your DrawStripFrame constructor set alpha to zero. Like this:

    public DrawStripFrame (Context context){
        super (context);
        holder = getHolder();
    
        setAlpha(0); // this is the secret
    }
    
    0 讨论(0)
  • 2020-12-19 05:16

    I had this same problem. I tested my APP on different emulators.

    This was my MainActivity class

    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>
    

    I solved it removing the item background from styles.xml

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

    It looks a problem with the alpha channel.

    0 讨论(0)
  • 2020-12-19 05:16

    The problem is solved by changing the while loop like this:

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

    The continue statement sends control back to the top of the loop when surface is invalid. Only when surface is valid, the block below will be executed.

    0 讨论(0)
  • 2020-12-19 05:17

    Make sure you have given Camera Permission otherwise SurfaceView shows black screen.

    0 讨论(0)
  • 2020-12-19 05:20

    SurfaceView basically doesn't supporting animation, scrolling etc. So, you should use TextureView.

    0 讨论(0)
提交回复
热议问题