这篇文章是描述怎么样在ios和android上设置设备的方向。
正如你所知道的,有两种方法来设置设备方向:
1. OpenGL / Cocos2d-x方式
这种方式很快,但是不会旋转UIKit对象(ios)或者小部件(android)。
2. ViewController方式(IOS)或者设置xml(android)
这种方法有一点慢,但是UIKit对象(IOS)或者小部件(android)就会正确的位置和方向。
openGL方式
你可以像下面那样设置设备方向:
CCDirector::sharedDirector()->setDeviceOrientation(kCCDeviceOrientationLandscapeLeft);
这种方式只能旋转cocos2d引擎渲染的对象,例如精灵或者标签。
ViewController方式(IOS)
让设备方向检测起作用可以像下面这样:
告诉系统那些方向是我们需要的支持(RootViewController.mm)
- // Override to allow orientations other than the default landscape orientation.
- - (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation {
- return UIInterfaceOrientationIsLandscape( interfaceOrientation );
- }
把openGL渲染的view替换root view controller的view(AppController.mm)
- // Use RootViewController manage EAGLView
- viewController = [[RootViewController alloc] initWithNibName:nil bundle:nil];
- viewController.wantsFullScreenLayout = YES;
- viewController.view = __glView;
这个代码是使用cocos2d-x实现的,可以作为IOS的一个范例。
通过AndroidManifest.xml设置设备的方向
- <application android:label="@string/app_name" android:debuggable="true" android:icon="@drawable/icon">
- <activity android:name=".ApplicationDemo"
- android:label="@string/app_name"
- android:screenOrientation="landscape"
- android:theme="@android:style/Theme.NoTitleBar.Fullscreen"
- android:configChanges="orientation">
- <intent-filter>
- <action android:name="android.intent.action.MAIN" />
- <category android:name="android.intent.category.LAUNCHER" />
- </intent-filter>
- </activity>
- </application>
总结
1. 假如想要在ios中使用OpenGL的方式。那么就不要使用了RootViewController。
2. 假如想要在Android中使用OpenGL的方式,那么在AndroidManifest.xml中设置设备方向为竖直(portrait)。
3. 假如你不想要使用任何的UIkit的东西(ios)或者小部件(android),那么建议使用OpenGL的方式,这样最快。
支持多方向
以下设置多方向的方式是适用于cocos2d-x 2.0.2所创建的工作空间。
这种补丁可能不会在以后的cocos2d-x所支持,或者部分被弃用。
IOS
1.注释掉cocos2dx/platform/ios/CCEGLView.mm::setContentScaleFactor(…)中的assert(m_eResolutionPolicy kResolutionUnKnown);
2.注释掉cocos2dx/platform/CCEGLViewProtocol.cpp::setDesignResolutionSize(…)中的CCAssert(m_bIsRetinaEnabled false, “can not enable retina while set design resolution size!”);
3.在shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)orientation的方法里面返回true。
4.在(void)didRotateFromInterfaceOrientation:(UIInterfaceOrientation)fromInterfaceOrientation中增加下面的代码:
- CGSize s;
- if (UIInterfaceOrientationIsLandscape(UIApplication.sharedApplication.statusBarOrientation)) {
- s = CGSizeMake(std::max<float>(UIScreen.mainScreen.bounds.size.width, UIScreen.mainScreen.bounds.size.height), std::min<float>(UIScreen.mainScreen.bounds.size.width, UIScreen.mainScreen.bounds.size.height));
- } else {
- s = CGSizeMake(std::min<float>(UIScreen.mainScreen.bounds.size.width, UIScreen.mainScreen.bounds.size.height), std::max<float>(UIScreen.mainScreen.bounds.size.width, UIScreen.mainScreen.bounds.size.height));
- }
- cocos2d::CCDirector* director = cocos2d::CCDirector::sharedDirector();
- director->enableRetinaDisplay(false);
- director->getOpenGLView()->setFrameSize(s.width, s.height);
- director->getOpenGLView()->setDesignResolutionSize(s.width, s.height, kResolutionShowAll);
- director->enableRetinaDisplay(true);
Android
1. 把nativeInit(w, h);添加到cocos2dx/platform/android/java/src_common/org/cocos2dx/lib/Cocos2dxRenderer.java -> void onSurfaceChanged(GL10 gl, int w, int h).中。
2. 把下面的代码添加到void Java_org_cocos2dx_lib_Cocos2dxRenderer_nativeInit(JNIEnv* env, jobject thiz, jint w, jint h):
- cocos2d::CCEGLView* view = cocos2d::CCDirector::sharedDirector()->getOpenGLView();
- if (!view) {
- ...
- } else {
- ...
- if (view->getFrameSize().width != w || view->getFrameSize().height != h) {
- view->setFrameSize(w, h);
- view->setDesignResolutionSize(w, h, kResolutionShowAll);
- }
- }