2013-04-02 35 views
2

我在SurfaceView上使用canvas.drawText,輸出在仿真器上看起來正確,但是當我將應用程序部署到我的設備(Samsung Galaxy S3)時,文本被寫入從上到下是這樣的:Surfaceview上的Drawtext只能在模擬器上工作,而不能在設備上工作

T 
E 
s 
t 

Wrong output on Device Samsung Galaxy S3

它看起來像一個斷行的文本的每個字符後添加。

如果設備是風景或不是,它只是從來沒有工作,我不明白爲什麼。

我在做什麼錯?

Emulator shows output correctly

在AndroidManifest.xml中我使用:

<uses-sdk 
    android:minSdkVersion="8" 
    android:targetSdkVersion="8" /> 

的代碼我使用:

public class MainActivity extends Activity { 

    DemoView renderView; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     renderView = new DemoView(this); 
     setContentView(renderView); 
    } 

    @Override 
    public void onResume() { 
     super.onResume(); 
     renderView.resume(); 
    } 

    @Override 
    public void onPause() { 
     super.onPause(); 
     renderView.pause(); 
    } 

    private class DemoView extends SurfaceView implements Runnable{ 
     Thread renderThread = null; 
     SurfaceHolder holder; 
     volatile boolean running = false; 

     public DemoView(Context context){ 
      super(context); 
      this.holder = getHolder(); 
     } 

     public void resume() { 
      running = true; 
      renderThread = new Thread(this); 
      renderThread.start(); 
     } 

     public void run() { 
      Canvas canvas; 

      while(running) { 
       if(!holder.getSurface().isValid()) 
        continue; 
       Paint test = new Paint(Color.YELLOW); 
       test.setColor(Color.YELLOW); 
       canvas = holder.lockCanvas(); 
       canvas.drawText("TEst", 10, 10, test); 
       holder.unlockCanvasAndPost(canvas); 
      } 
     } 

     public void pause() { 
      running = false; 
      while(true) { 
       try { 
        renderThread.join(); 
        break; 
       } catch (InterruptedException e) { // retry 
       } 
      } 
     } 
    } 
} 

感謝您的幫助! Stephoid

+0

你有沒有從設備堆棧跟蹤顯示? –

+0

@MarekSebera爲什麼會有堆棧跟蹤?它不會崩潰,只是表現出意想不到的行爲。 – kabuko

+0

@ kabuko對不起,誤解了這個問題。無論如何,我沒有看到你在onCreate中爲視圖設置任何尺寸,你可以嘗試設置視圖的寬度和高度嗎? –

回答

1

您使用SurfaceHolder是很奇怪的。我在想這個意想不到的行爲是由於這個。這是我如何使用SurfaceView過去:

public void run() { 
     Canvas canvas; 

     while(running) { 
      try { 
       if(!holder.getSurface().isValid()) 
       continue; 
       canvas = holder.lockCanvas(); 
       synchronized (surface) { 
       //Code to draw text/etc 
       } 
      } catch (...) { 
      } finally { 
       holder.unlockCanvasAndPost(canvas); 
      }     
     } 
    } 

注意你失蹤lockCanvas表達實際分配帆布與unlockCanvasAndPost

+0

感謝您的回答。我有一些問題: - 你如何初始化'canvas'?用canvas = null? 'finally'在未初始化時不編譯 - 正在同步(holder.getSurface())'正確嗎? - 你爲什麼覺得我的代碼中缺少'lockCancvas'? 除了Try-Catch塊和同步我的代碼具有相同的結構? – Stepoid

+0

哇同步'(holder.getSurface()){'它的工作原理!謝謝@TheCapn – Stepoid

+0

我完全錯過了你的代碼上的lockCanvas調用。對不起,我很高興你把它修好了,但我應該只是幫助你找到正確的位置。祝你好運。 – Grambot

0

的問題是,我初始化Paint test錯配對!

WRONG:

Paint test = new Paint(Color.YELLOW); 

正確:

Paint test = new Paint(); 
test.setColor(Color.YELLOW); 

一個非常小的事情,但有很大的影響!

相關問題