Drawtext на surfaceview работает только на эмуляторе, но не на устройстве


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

T
E
s
t

Неправильный вывод на устройстве Samsung Galaxy S3

Похоже, что после каждого символа текста добавляется разрыв строки.

Неважно, является ли устройство ландшафтным или нет, оно просто никогда не работает, и я не могу понять, почему.

Что я делаю не так?

Эмулятор показывает вывод корректно

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

Спасибо за помощь! Стефоид

2 2

2 ответа:

Ваше использование 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, чтобы фактически назначить canvas и сопряжение с unlockCanvasAndPost

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

Неверно:

Paint test = new Paint(Color.YELLOW);

Правильно:

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

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