• cocos2dx之WebView踩过的坑(android返回键处理问题)


      最近游戏接入了一个私服平台,由于没有sdk,所以支付相关的操作需要在网页端进行,也就是说点击充值需要在游戏内部弹出一个网页,并定位到平台充值的地址。查阅相关资料后决定使用cocos2dx自带的WebView来完成这项任务。WebView的使用方式非常简单,代码如下:

    #include "ui/CocosGUI.h"
    using namespace cocos2d::experimental::ui; m_WebView = WebView::create(); // m_WebView为成员变量 m_WebView->setPosition(visibleSize / 2);
    m_WebView->setContentSize(visibleSize); 

    m_WebView
    ->loadURL("http://www.baidu.com");

    m_WebView
    ->setScalesPageToFit(true);

    m_WebView
    ->setOnShouldStartLoading([](WebView *sender, const std::string&url)
    {
      return true; }); m_WebView->setOnDidFinishLoading([](WebView *sender, const std::string&url)
    { }); m_WebView
    ->setOnDidFailLoading([](WebView *sender, const std::string&url)
    {
    });
    this->addChild(m_WebView);

    是不是很简单?但是在测试的时候却出现了问题。弹出网页之后,如果点击返回键游戏就会退出,分析之后发现是View处理返回键的默认操作是销毁当前Activity。理想的效果是在弹出WebView之后,如果点击返回键,先判断网页是否可返回,如果可返回就退到上一级网页,如果不可返回(在最初的网页),就关闭WebView,返回游戏。

    首先监听游戏内部返回键,并处理返回键逻辑:

    bool FirstScene::init()
    {
         //注册捕捉监听
        auto listenerkeyPad = EventListenerKeyboard::create();
        listenerkeyPad->onKeyReleased = CC_CALLBACK_2(FirstScene::onKeyReleased, this);
        _eventDispatcher->addEventListenerWithSceneGraphPriority(listenerkeyPad, this);
    }
     
    void FirstScene::onKeyReleased(EventKeyboard::KeyCode keycode, cocos2d::Event *event)
    {
        if (keycode == EventKeyboard::KeyCode::KEY_BACKSPACE) 
        {    
            if (m_WebView) // 如果WebView正在显示                            
            {
                if (m_WebView->canGoBack()) // 判断是否可返回到上一级网页
                {
                    m_WebView->goBack();
                }
                else
                {
                    m_WebView->runAction(RemoveSelf::create());    // 关闭WebView
    
                    m_WebView = nullptr;
                }
            }
            else // 如果处于游戏主界面
            {
                Director::getInstance()->popScene(); // 结束游戏
            }  
        }
    }

    接下来让WebView弹出来时点击返回键也执行上述逻辑,这要修改WebView源代码,打开Cocos2dxWebView.java,路径为:src/org/cocos2dx/lib/Cocos2dxWebView.java

     public Cocos2dxWebView(Context context, int viewTag) {
        super(context);
        this.mViewTag = viewTag;
        this.mJSScheme = "";
    
        this.setFocusable(true);
        this.setFocusableInTouchMode(true);
    
        this.getSettings().setSupportZoom(false);
    
        this.getSettings().setDomStorageEnabled(true);
        this.getSettings().setJavaScriptEnabled(true);
    
        // `searchBoxJavaBridge_` has big security risk. http://jvn.jp/en/jp/JVN53768697
        try {
            Method method = this.getClass().getMethod("removeJavascriptInterface", new Class[]{String.class});
            method.invoke(this, "searchBoxJavaBridge_");
        } catch (Exception e) {
            Log.d(TAG, "This API level do not support `removeJavascriptInterface`");
        }
    
        this.setWebViewClient(new Cocos2dxWebViewClient());
        this.setWebChromeClient(new WebChromeClient());
        
        this.setOnKeyListener(new OnKeyListener() 
        {
            @Override
            public boolean onKey(DialogInterface dialog, int keyCode, KeyEvent event)
            {
                if (keyCode == KeyEvent.KEYCODE_BACK) // 返回键
                {
                    Cocos2dxGLSurfaceView.getInstance().onKeyDown(keyCode, KeyEvent) // 调用游戏主界面的事件监听函数
    
                    return true; // 拦截事件,禁止事件向下传递
                }
    
                return false; // 其他事件不做处理,继续传递
            }
        });
     }

    其中Cocos2dxGLSurfaceView就是游戏界面的View,当WebView的返回键事件触发时,直接调用游戏主界面的事件监听函数,并禁止事件向下传递。

  • 相关阅读:
    nginx路径详解
    负载均衡
    http中消息头的安全配置及工作原理
    Tomcat的ErrorPage实现原理分析及阀门ErrorReportValve
    Tomcat中Logger组件
    NIO在Tomcat中的应用
    vue中强制生效css样式
    k8s中的Ingress
    xhr.withCredentials与 CORS 什么关系
    Redis Cluster集群
  • 原文地址:https://www.cnblogs.com/zchajax/p/7232914.html
Copyright © 2020-2023  润新知