2013-04-02 5 views
2

Я использую canvas.drawText на SurfaceView, и результат выглядит корректно на эмуляторе, но когда я развертываю приложение на своем устройстве (Samsung Galaxy S3), текст написан сверху вниз, как это:Drawtext on surfaceview работает только на эмуляторе, но не на устройстве

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 = null? 'finally' не компилируется, когда он не инициализирован - это' synchronized (holder.getSurface()) 'correct? - почему, по-вашему, мне не хватает «lockCancvas» в моем коде? За исключением блока Try-Catch и синхронизированного моего кода имеет одинаковую структуру? – Stepoid

+0

wow с 'synchronized (holder.getSurface()) {' он работает !!! Спасибо @ TheCapn – Stepoid

+0

Я полностью пропустил lockCanvas вызов вашего кода. Извините, я рад, что вы исправили его, но я предположил, что просто помог вам взглянуть в нужном месте. Удачи. – Grambot

0

Проблема в том, что я инициализируется Paint test неправильно!

НЕПРАВИЛЬНО:

Paint test = new Paint(Color.YELLOW); 

Правильно:

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

очень маленькая вещь, но имел большой эффект!