从cocos2dx调用android runOnUiThread可能会使menutitem闪烁

时间:2014-05-26 02:46:54

标签: android cocos2d-x cocos2d-x-3.0

我最近一直在玩cocos2dx,有时我需要调用java代码来做一些Android特定的工作。所以我在Java代码中添加一个静态方法,并在方法中调用runOnUiThread来完成这项工作。 C ++调用静态java方法。

它确实工作正常,但有时调用会使触发调用的menuItem闪烁,而在其他时候,它看起来很完美。

我有一个共享功能,代码如下所示,共享按钮(菜单项)有时会在我点击后闪烁。有人能帮助我吗?谢谢!

我记得在某个地方看到了类似的问题,但今天就不能谷歌了......

爪哇

...
public static void onShare(final int mode, final int score) {
    ((AppActivity)mContext).runOnUiThread(new Runnable() {
    public void run() {
        Intent sendIntent = new Intent();
        sendIntent.setAction(Intent.ACTION_SEND);
        if(mode == 0) {
            sendIntent.putExtra(Intent.EXTRA_TEXT, ((AppActivity)mContext).getResources().getString(R.string.share_content0, score));
        }
        else {
            sendIntent.putExtra(Intent.EXTRA_TEXT, ((AppActivity)mContext).getResources().getString(R.string.share_content1, score));
        }
        sendIntent.setType("text/plain");
        ((AppActivity)mContext).startActivity(Intent.createChooser(sendIntent, ((AppActivity)mContext).getResources().getString(R.string.send_to)));
    }
    });
}
...

C ++,platform.cpp

...
void doShare(int mode, int score) {
    JniMethodInfo t;
    if( JniHelper::getStaticMethodInfo(t,APPACTIVITY,
        "onShare", "(II)V")) {
        t.env->CallStaticIntMethod(t.classID, t.methodID, mode, score);
    }
}
...

C ++,HelloScene.cpp

...
void GameBase::onGameOver(){
...
    auto menuShare = MenuItemFont::create(sr->getString(RSTR::share), CC_CALLBACK_1(GameBase::onShare, this));
...
}
...
void GameBase::onShare(Ref* pSender){
    CocosDenshion::SimpleAudioEngine::getInstance()->playEffect(SOUND_BTN);
#if (CC_TARGET_PLATFORM==CC_PLATFORM_ANDROID || CC_TARGET_PLATFORM==CC_PLATFORM_IOS)
    doShare(this->_mode, this->_best);
#endif /* CC_TARGET_PLATFORM */
}
....

* sr-> getString(RSTR :: share),这是为了支持多语言,它在英文环境中返回文本'Share'。

AppDelegate.cpp

void AppDelegate::applicationDidEnterBackground() {
    director->pause();
    director->stopAnimation();
    GameBase *game;
    auto scene = director->getRunningScene();
    if (game = dynamic_cast<GameBase *>(scene->getChildByTag(TAG_GAMESCENE))) {
        game->onSaveProgress();
    }
}

void AppDelegate::applicationWillEnterForeground() {
    director->resume();
    director->startAnimation(); 
}

2 个答案:

答案 0 :(得分:2)

在你的AppDelegate.cpp

功能&gt;&gt;&gt; applicationDidEnterBackground

在功能&gt;&gt;&gt; applicationWillEnterForeground

我建议您使用c ++指令来区分iOS和Android的代码片段。

对于Android部分,仅使用PAUSE / RESUME对,对于iOS,请使用您粘贴的那个。

所以它会是

//applicationDidEnterBackground 
#if (CC_TARGET_PLATFORM==CC_PLATFORM_ANDROID)
    director->pause();
#else
    director->pause();
    director->stopAnimation();
#endif

//applicationWillEnterForeground 
#if (CC_TARGET_PLATFORM==CC_PLATFORM_ANDROID)
    director->resume();
#else
    director->resume();
    director->startAnimation(); 
#endif

希望这有帮助!

答案 1 :(得分:0)

我在platform.cpp等效

中使用以下代码
    #if (CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID)
    void onShare() {
         cocos2d::JniMethodInfo t;
        if (cocos2d::JniHelper::getStaticMethodInfo(t
                                                    , NativeActivityClassName
                                                    , "onShare"
                                                    , "()V"))
        {
            t.env->CallStaticVoidMethod(t.classID, t.methodID);
            t.env->DeleteLocalRef(t.classID);
        }
    }

    #endif

没有闪烁分享按钮,它工作正常。你是通过其他方式打电话的吗?