2

SurfaceView で canvas.drawText を使用すると、エミュレータでは出力が正しく表示されますが、アプリをデバイス (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
                }
            }
        }
    }
}

ご協力いただきありがとうございます!ステフォイド

4

2 に答える 2

1

Your use of SurfaceHolder is pretty weird. I'm thinking the unintended behavior is due to that. This is how I've used SurfaceView in the past:

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

Note your missing lockCanvas expression to actually assign canvas and pair with unlockCanvasAndPost

于 2013-04-04T16:28:09.620 に答える
0

問題は、私がPaint test間違って初期化したことでした!

違う:

Paint test = new Paint(Color.YELLOW);

正しい:

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

ほんの些細なことですが、効果は絶大でした!

于 2013-04-06T08:40:46.507 に答える