Cocos2dx 2.x Android gravity detection rotating screen, cocos2dx android

Source: Internet
Author: User

Cocos2dx 2.x Android gravity detection rotating screen, cocos2dx android

In the case of charging, when playing with a mobile phone, the screen usually needs a specific rotation direction.

The function is divided into two parts: one is to obtain the desired Angle Based on the mobile phone's gravity direction X, Y, and Z; the other is to set the screen rotation direction based on the rotation angle.

Listen to the value of the phone in the direction of X, Y, and Z to calculate the angle around a certain axis. X and Y are parallel to the mobile phone interface, while Z is perpendicular to the mobile phone interface.

This article takes the rotation around the Y axis as an example. If you want to rotate around the Z axis, you only need to swap Y and Z. In general, only these two cases are required.

The code is used for reference on the Internet.


package com.gamemaster.orientation;import android.hardware.Sensor;import android.hardware.SensorEvent;import android.hardware.SensorEventListener;import android.os.Handler;public class OrientationSensorListener implements SensorEventListener { private static final int _DATA_X = 0;     private static final int _DATA_Y = 1;     private static final int _DATA_Z = 2;          public static final int ORIENTATION_UNKNOWN = -1;          private Handler rotateHandler;               public OrientationSensorListener(Handler handler) {rotateHandler = handler;}public void onAccuracyChanged(Sensor arg0, int arg1) {// TODO Auto-generated method stub}public void onSensorChanged(SensorEvent event) {float[] values = event.values;        int orientation = ORIENTATION_UNKNOWN;        float X = -values[_DATA_X];        float Y = -values[_DATA_Y];        float Z = -values[_DATA_Z];          float magnitude = X*X + Z*Z;        // Don't trust the angle if the magnitude is small compared to the y value        if (magnitude * 4 >= Y*Y) {            float OneEightyOverPi = 57.29577957855f;            float angle = (float)Math.atan2(-Z, X) * OneEightyOverPi;            orientation = 90 - (int)Math.round(angle);            // normalize to 0 - 359 range            while (orientation >= 360) {                orientation -= 360;            }             while (orientation < 0) {                orientation += 360;            }        }                if (rotateHandler!=null) {rotateHandler.obtainMessage(888, orientation, 0).sendToTarget();}}}

The second part sets the screen direction based on the rotation angle.

package com.gamemaster.orientation;import android.app.Activity;import android.os.Handler;import android.os.Message;import android.util.Log;public class ChangeOrientationHandler extends Handler {private Activity activity;public ChangeOrientationHandler(Activity ac) {super();activity = ac;}@Overridepublic void handleMessage(Message msg) {  if (msg.what==888) {int orientation = msg.arg1;if (orientation>70&&orientation<135) {activity.setRequestedOrientation(8);}else if (orientation>135&&orientation<225){//activity.setRequestedOrientation(9); }else if (orientation>225&&orientation<290){activity.setRequestedOrientation(0);}else if ((orientation>315&&orientation<360)||(orientation>0&&orientation<45)){//activity.setRequestedOrientation(1); }}super.handleMessage(msg);        }}

Add

private Handler handler;    private OrientationSensorListener listener;private SensorManager sm;private Sensor sensor;

Add in the onCreate Function

handler = new ChangeOrientationHandler(this);     sm = (SensorManager)getSystemService(Context.SENSOR_SERVICE);    sensor = sm.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);           listener = new OrientationSensorListener(handler);    sm.registerListener(listener, sensor, SensorManager.SENSOR_DELAY_UI);


Copyright Disclaimer: This article is an original article by the blogger and cannot be reproduced without the permission of the blogger.

Contact Us

The content source of this page is from Internet, which doesn't represent Alibaba Cloud's opinion; products and services mentioned on that page don't have any relationship with Alibaba Cloud. If the content of the page makes you feel confusing, please write us an email, we will handle the problem within 5 days after receiving your email.

If you find any instances of plagiarism from the community, please send an email to: info-contact@alibabacloud.com and provide relevant evidence. A staff member will contact you within 5 working days.

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.