最近進入了一個第三方的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控件提供一個可行的思路,如果需要增加很多其他各種控件,最好新增一個管理類來集中處理