【问题标题】:Drawtext on surfaceview does only work on emulator but not on deviceSurfaceview 上的 Drawtext 仅适用于模拟器,但不适用于设备
【发布时间】:2013-04-02 21:00:23
【问题描述】:

我在 SurfaceView 上使用 canvas.drawText 并且输出在模拟器上看起来是正确的,但是当我将应用程序部署到我的设备(三星 Galaxy S3)时,文本从上到下书写如下:

T
E
s
t

看起来像是在文本的每个字符后添加了一个换行符。

设备是否是横向的并不重要,它永远无法工作,我不知道为什么。

我做错了什么?

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

感谢您的帮助! 史蒂芬

【问题讨论】:

  • 你有任何来自设备的堆栈跟踪要显示吗?
  • @MarekSebera 为什么会有堆栈跟踪?它没有崩溃,只是表现出意外的行为。
  • @kabuko 对不起,误解了这个问题。无论如何,我没有看到您在 onCreate 中为视图设置任何尺寸,您可以尝试设置视图的宽度和高度吗?
  • @MarekSebera SurfaceView 填满了整个屏幕,我可以在它的任何地方画线。所以我不知道如何为视图设置额外的宽度/高度?正如 kabuko 所说,没有堆栈跟踪。

标签: android android-canvas surfaceview drawtext


【解决方案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 配对

【讨论】:

  • 感谢您的回答。我有一些问题: - 你如何初始化canvas?画布=空? finally 在未初始化时未编译 - synchronized(holder.getSurface()) 正确吗? - 为什么你认为我的代码中缺少lockCancvas?除了 Try-Catch 块和同步我的代码具有相同的结构?
  • 我完全错过了对您的代码的 lockCanvas 调用。对此很抱歉,我很高兴你把它修好了,但我想我只是帮你找对了位置。祝你好运。
【解决方案2】:

问题是我初始化 Paint test 错误!

错误:

Paint test = new Paint(Color.YELLOW);

正确:

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

一件小事却有大作用!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-11-01
    • 2011-03-08
    • 2015-02-13
    • 2011-03-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多