最近需要在我们横版游戏接入一个webview,而webview是竖版的,就鼓捣了下设备屏幕旋转,同时支持web,android,ios平台,下面是实现方案(初始方向为横版):
- 设置屏幕旋转 cc.view.setOrientation(),这个API的描述文档写着对native无效,实际上还是有影响的
- 设置framesize为对应方向的尺寸 cc.view.setFrameSize()
- 更改canvas的 designResolution 和其他参数
WEB平台: web平台本身就支持旋转,执行上面步骤就可以完美适配
ANDROID平台(AppActivity.java里添加以下代码,需要import android.content.pm.ActivityInfo;):
public static void setOrientation(String dir){
if(dir.equals("V"))
((AppActivity)(SDKWrapper.getInstance().getContext())).setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_SENSOR_PORTRAIT);
else
((AppActivity)(SDKWrapper.getInstance().getContext())).setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_SENSOR_LANDSCAPE);
}
((AppActivity)(SDKWrapper.getInstance().getContext()))只是为了拿到AppActivity的实例,你也可以存个变量
IOS平台(AppController.mm里添加以下代码):
UIInterfaceOrientationMask oMask = UIInterfaceOrientationMaskLandscape;
-(UIInterfaceOrientationMask)application:(UIApplication *)application supportedInterfaceOrientationsForWindow:(UIWindow *)window{
return oMask;
}
+(void)setOrientation:(NSString*)dir{
if([dir isEqualToString:@"V"]){
oMask = UIInterfaceOrientationMaskPortrait;
[[UIDevice currentDevice] setValue:[NSNumber numberWithInteger:UIInterfaceOrientationPortrait] forKey:@"orientation"];
}
else{
oMask = UIInterfaceOrientationMaskLandscape;
[[UIDevice currentDevice] setValue:[NSNumber numberWithInteger:UIInterfaceOrientationLandscapeRight] forKey:@"orientation"];
}
}
ios平台的查了些资料,发现好多实现都是需要同时勾选设备的横向、竖向,最后才发现用supportedInterfaceOrientationsForWindow可以很容易实现。
oMask的初始值要与你项目的Device Orientation相同,我的demo中是勾选了 LandScape Left 和 LandScape Right。
下面的项目demo
rotate.zip (7.9 KB)