当我尝试setTranslationX和setTranslationY时,SurfaceView中的致命异常

时间:2015-07-19 03:47:11

标签: android android-canvas surfaceview

我在游戏中使用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来自正确的线程?我需要能够不断更新我的表面视图,或者至少在玩家移动时更新它。

1 个答案:

答案 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);

    }
});

请参阅View.post(Runnable)