簡體   English   中英

SurfaceView 顯示黑屏 - Android

[英]SurfaceView shows black screen - Android

基本上我想用 SurfaceView 做動畫。 因此該類實現了 Runnable。 為了實驗,我想畫一個圓圈。 但是,它僅顯示黑屏。

我已經嘗試了好幾天了。 如果有人可以提供幫助,真的很感激。

主活動類

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

        }
    }
}

我有同樣的問題。 我在不同的模擬器上測試了我的 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();
            }
        }
    }
}

樣式文件

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

看起來 alpha 通道有問題。

這個問題是通過像這樣改變while循環來解決的:

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

當表面無效時, continue 語句將控制發送回循環的頂部。 只有在surface有效時,才會執行下面的程序段。

在您的 DrawStripFrame 構造函數中,將 alpha 設置為零。 像這樣:

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

    setAlpha(0); // this is the secret
}

確保您已授予Camera Permission否則 SurfaceView 會顯示黑屏。

SurfaceView 基本上不支持動畫、滾動等。所以,你應該使用TextureView。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM