[英]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.