我在游戏中使用setTranslationX和setTranslationY来移动我的SurfaceView,以便我的播放器始终位于屏幕的中心。我使用的确切方法是:
mySurfaceView.setTranslationX(-player.getX() + GameActivity.GAME_WIDTH/2);
mySurfaceView.setTranslationY(-player.getY() + GameActivity.GAME_HEIGHT/2);
不幸的是,当我试图移动我的播放器时,我得到一个致命的例外,其中包括:
07-18 23:27:58.628 3059-3085/com.packname.www.gamename E/AndroidRuntime﹕ FATAL EXCEPTION: Thread-2018
android.view.ViewRootImpl$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views.
at android.view.ViewRootImpl.checkThread(ViewRootImpl.java:4746)
at android.view.ViewRootImpl.invalidateChildInParent(ViewRootImpl.java:854)
at android.view.ViewGroup.invalidateChildFast(ViewGroup.java:4193)
at android.view.View.invalidateViewProperty(View.java:10423)
at android.view.View.setTranslationX(View.java:9743)
at com.packname.www.gamename.game.PlayState.render(PlayState.java:77)
我将如何解决此异常?每当他移动时我都需要我的播放器保持在屏幕的中心。另外我不能使用canvas.translate(x,y),因为这不会改变我用来移动播放器的TouchListeners接收的坐标。因此,如果我使用canvas.translate(x,y),那么我的碰撞矩形最终将位于我的播放器渲染的位置。因此我需要mySurfaceView.setTranslateX()和mySurfaceView.setTranslateY()方法。
编辑:似乎我没有打电话给setTranslationX& Y来自正确的线程。我怎么去调用setTranslationX& Y来自正确的线程?我需要能够不断更新我的表面视图,或者至少在玩家移动时更新它。
答案 0 :(得分:1)
尝试
mySurfaceView.post(new Runnable() {
public void run() {
mySurfaceView.setTranslationX(-player.getX() + GameActivity.GAME_WIDTH/2);
mySurfaceView.setTranslationY(-player.getY() + GameActivity.GAME_HEIGHT/2);
}
});