我在遵循典型的 Android 图形流程时遇到了一些麻烦。有很多例子,但我的似乎不起作用。在我的主要活动中,我这样做:
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
在我的资源文件中,我有 3 个覆盖 SurfaceView 的自定义类。在我的这些表面视图的构造函数中,我有这样的东西:
super(context, attrs);
getHolder().addCallback(this);
this.thread = new MyThread(getHolder(),this);
在我的线程的运行方法中,我这样做(从我见过的许多示例中提取):
Canvas c;
try {
c = surfaceHolder.lockCanvas(null);
synchronized (surfaceHolder) {
panel.onDraw(c);
}
} finally {
if (c != null) {
surfaceHolder.unlockCanvasAndPost(c);
}
该线程在我的 SurfaceView 的“surfaceCreated”事件中启动。在 onDraw 我这样做:
public void onDraw(Canvas canvas) {
super.onDraw(canvas);
<some drawing stuff here using canvas>
}
当我运行时,线程确实在运行,并且我可以看到 onDraw 正在被调用(我在其中放置了 log print 命令),但是我的图形没有按预期更新。但是,如果我调用 this.invalidate(),图形会按照我的预期更新几次,直到我崩溃:
E/AndroidRuntime(748): android.view.ViewRootImpl$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views.
根据我看到的示例,我意识到我不需要在 OnDraw 中调用 invalidate,但我这样做只是为了验证我的 onDraw 中的代码是否有效。所以,在我看来,如果没有 invalidate() 事件就会被调用,我的代码应该正确更新图形,但屏幕永远不会更新。我在主 Activity 如何实际决定它需要重新绘制它的孩子方面遗漏了一些东西。
任何想法将不胜感激。我花了一段时间试图从一些工作演示中复制东西,但我似乎被卡住了。谢谢