quick-cocos2d Webview控件上添加 Button

最近進入了一個第三方的api遊戲,需要自定義一個返回按鈕,來作爲退出遊戲的邏輯處理,剛開始的是使用cocos2d Button控件,像平時那樣調整層級或者ZOrder,但是無論設置多高,Webview都始終在最上層。原來WebView是系統的原生的控件,屬於手機原生層,而cocos2d的都在OPGL層,所以我們必須去修改原生代碼纔行。也就是引擎中UIWebViewImpl-ios.mm  以UIWebViewImpl-android.cpp 這兩個文件。

首先我們來處理Android:

打開之後發現UIWebViewImpl-android.cpp只是提供調用接口,具體的實現是"org/cocos2dx/lib/Cocos2dxWebViewHelper"這個類中:找到createWebView()方法,然後在裏面增加android 原生Button控件:

 public static int createWebView() {
        final int index = viewTag;
        sCocos2dxActivity.runOnUiThread(new Runnable() {
            @Override
            public void run() {
                final Cocos2dxWebView webView = new Cocos2dxWebView(sCocos2dxActivity, index);
                Button backButton = new Button(sCocos2dxActivity);//新增的按鈕
                backButton.setBackgroundResource(R.drawable.btn_chat_close);//按鈕資源路徑
                backButton.setLayoutParams(new LinearLayout.LayoutParams(LinearLayout.LayoutParams.WRAP_CONTENT, LinearLayout.LayoutParams.WRAP_CONTENT));
                backButton.setOnClickListener(new OnClickListener() {//按鈕回調
                    @Override
                    public void onClick(View view) {
                        Log.i("backButtononClick", "backButtononClick");
                        AlertDialog.Builder builder = new AlertDialog.Builder(sCocos2dxActivity);  //先得到構造器
                        builder.setTitle("提示"); //設置標題
                        builder.setMessage("是否確認退出?"); //設置內容
                        builder.setPositiveButton("確定", new DialogInterface.OnClickListener() { //設置確定按鈕
                            @Override
                            public void onClick(DialogInterface dialog, int which) {
                                closeThirdGame();//回調cocos的函數邏輯處理
                                dialog.dismiss(); //關閉dialog
                            }
                        });
                        builder.setNegativeButton("取消", new DialogInterface.OnClickListener() { //設置取消按鈕
                            @Override
                            public void onClick(DialogInterface dialog, int which) {
                                dialog.dismiss();
                            }
                        });
                        builder.create().show();
                    }
                });
                webView.setOnKeyListener(new View.OnKeyListener() {
                    @Override
                    public boolean onKey(View v, int keyCode, KeyEvent event) {
                        if (event.getAction() == KeyEvent.ACTION_DOWN) {
                            if (keyCode == KeyEvent.KEYCODE_BACK && webView.canGoBack()) {
                                webView.goBack();
                                Cocos2dxGLSurfaceView.getInstance().requestFocus();
                                return true;
                            }
                        }
                        else {
                            Cocos2dxGLSurfaceView.getInstance().requestFocus();
                        }
                        return false;
                    }
                });
                FrameLayout.LayoutParams lParams = new FrameLayout.LayoutParams(
                        FrameLayout.LayoutParams.WRAP_CONTENT,
                        FrameLayout.LayoutParams.WRAP_CONTENT);
                webView.addView(backButton);//按鈕直接增加到webview上面
                sLayout.addView(webView, lParams);
                webViews.put(index, webView);
            }
        });
        return viewTag++;
    }

 

ios處理:

打開UIWebViewImpl-ios.mm找到webview創建方法setupWebView(),增加ios原生按鈕控件到上面就好了

@interface UIWebViewWrapper () <UIWebViewDelegate>
@property(nonatomic, retain) UIWebView *uiWebView;
@property(nonatomic, retain) UIButton *backButton; //增加按鈕申明
@property(nonatomic, copy) NSString *jsScheme;
@end

@implementation UIWebViewWrapper {
    
}

+ (instancetype)webViewWrapper {
    return [[[self alloc] init] autorelease];
}

- (instancetype)init {
    self = [super init];
    if (self) {
        self.uiWebView = nil;
        self.backButton = nil;//初始化
        self.shouldStartLoading = nullptr;
        self.didFinishLoading = nullptr;
        self.didFailLoading = nullptr;
    }
    return self;
}

- (void)dealloc {
    self.uiWebView.delegate = nil;
    [self.uiWebView removeFromSuperview];
    self.uiWebView = nil;
    [self.backButton removeFromSuperview];//析構
    self.backButton = nil;
    self.jsScheme = nil;
    [super dealloc];
}

- (void)setupWebView {
    if (!self.uiWebView) {
        self.uiWebView = [[[UIWebView alloc] init] autorelease];
        self.uiWebView.delegate = self;
    }
    if (!self.backButton) {//ios按鈕創建

        self.backButton = [UIButton buttonWithType:UIButtonTypeCustom];
        [self.backButton setFrame:CGRectMake(0, 5, 57, 57)];
        [self.backButton setImage:[UIImage imageNamed:@"back.png"] forState:UIControlStateNormal];
        self.backButton.showsTouchWhenHighlighted = NO;
        [self.backButton addTarget:self action:@selector(onPressEnd) forControlEvents:UIControlEventTouchUpInside];//自定義按鈕回調
    }
   
    if (!self.uiWebView.superview) {
        auto view = cocos2d::Director::getInstance()->getOpenGLView();
        auto eaglview = (CCEAGLView *) view->getEAGLView();
        [eaglview addSubview:self.uiWebView];
    }
    if (!self.backButton.superview) { //添加
        [self.uiWebView addSubview:self.backButton];
    }
}

這只是一個添加簡單的按鈕,爲大家修改Webview控件提供一個可行的思路,如果需要增加很多其他各種控件,最好新增一個管理類來集中處理

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章