Cocos2dx 2.x 安卓重力检测 旋转屏幕

在充电的情况下,玩手机的时候,屏幕一般需要特定的旋转方向。

功能实现分成两部分:一部分根据手机重力方向X,Y,Z得出所需要的角度;另一方面根据旋转角度,设置屏幕旋转方向。

通过监听手机相对于X,Y,Z方向的值,算出绕着某一轴的角度。X,Y方向分别平行于手机界面,Z垂直于手机界面。

本文以绕Y轴旋转为例,如需绕Z轴只需把Y和Z互换,一般情况下只会要求这两种情况。

代码借鉴网上的。

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();
		}

	}

}

第二部分 根据旋转角度,设置屏幕方向。

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;
	}

	@Override
	public 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);
	}

}

在Cocos2dxActivity中的onCreate外面添加

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

在onCreate函数里面添加

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);

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-09 07:32:20

Cocos2dx 2.x 安卓重力检测 旋转屏幕的相关文章

安卓开发技术分享:旋转屏幕导致Activity重建

Android开发文档上专门有一小节解释这个问题.简单来说,Activity是负责与用户交互的最主要机制,任何“设置”(Configuration)的改变都可能对Activity的界面造成影响,这时系统会销毁并重建Activity以便反映新的Configuration. “屏幕方向”(orientation)是一个Configuration,通过查看Configuration类的javadoc可以看到其他Configuration还有哪些:如fontScale.keyboardHidden和lo

cocos2d-x V3.0 调用重力加速器 Acceleration

今天解决了一个问题心情很爽 哈哈: 今天解决的就是cocos2d-x 3.0 调用重力加速器的问题,网上搜了很多的资料 发现都是不行的,不能解决问题,不知道是不是我使用的是3.0 的版本问题,但是网上有些教程说的也是3.0 的版本啊,难道beta版和正式版也有那么大差别么?坑爹啊, 就说这个重写的方法吧:网上搜索的到好多都是重写父类的 didAccelerate(CCAcceleration* pAccelerationValue);方法,但是我用的3.0 根本就没有了这个方法,搜索的3.0 还

自动旋转屏幕默认旋转

如下图所示,在处理屏幕默认旋转方向的时候可以在这里进行选择,上下左右一共是4个方向. 策划的需求是游戏采用横屏,但是要求支持两个方向自动旋转,如下图所示,我的设置是这样的.Default Orientation* Auto Roation 表示游戏支持自动旋转屏幕,但是前提是手机没有锁定屏幕旋转功能.Landscape Right 和Landscape Left 表示手机屏幕只支持横屏两个方向的自动旋转. <ignore_js_op> 这里问题就来了,既然设置了两个方向的自动旋转,那么必然会有

Android——旋转屏幕导致Activity重建解决方法

Android开发文档上专门有一小节解释这个问题.简单来说,Activity是负责与用户交互的最主要机制,任何“设置”(Configuration)的改变都可能对Activity的界面造成影响,这时系统会销毁并重建Activity以便反映新的Configuration. “屏幕方向”(orientation)是一个Configuration,通过查看Configuration类的javadoc可以看到其他Configuration还有哪些:如fontScale.keyboardHidden和lo

android手机旋转屏幕时让GridView的列数与列宽度自适应

无意中打开了一年前做过的一个android应用的代码,看到里面实现的一个小功能点(如题),现写篇文章做个笔记.当时面临的问题是,在旋转屏幕的时候需要让gridview的列数与宽度能自适应屏幕宽度,每个单元格之间还需要保留一定的间距.因为每款手机的屏幕宽度不都相同,我们在指定了单元格的宽度与间距之后,并不能确定每行中所能容纳的单元格数量,这个数量必须在运行时通过计算得出,同样,我们设置的单元格宽度和间距不能保证刚好容纳在屏幕宽度内,为了解决这个问题,设计了一个简单的算法,首先需要预先指定单元格的宽

关于Android旋转屏幕丢失数据的新读

根据之前的经验,一直以为当Android屏幕旋转的时候会重新调用onCreate(),从而导致界面上所有的数据都会被重置,需要在Manifest中对Activity设置一个属性才能让他不重新走onCreate方法.或者很麻烦的需要在 onSaveInstanceState()方法中保存界面所有数据,然后在onRestoreInstanceState()方法中还原数据才行. 直到今天看到这样一句话: "By default, the system uses the Bundle instance

Android 中旋转屏幕,触摸,滚动

package com.learingselenium.android; import junit.framework.TestCase import org.openqa.selenium.Rotatable; import org.openqa.selenium.ScreenOrientation; import org.openqa.selenium.WebDriver; import org.openqa.selenium.android.AndroidDriver; import or

安卓手机怎么录屏幕 如何录制视频

大家喜欢录制视频教程分享给小伙伴吗?比方说可以录制Excel教程.ps教程.游戏教程.教学教程等等.那么安卓手机怎么录屏幕?下面就让我们一起来学一下.使用工具:手机&录屏操作方法:1.对于经常操作电脑的小伙伴来说,电脑屏幕录制掌握的也是相当熟练,但是对于手机录制的操作应该还没有那么熟悉吧!玩游戏很棒的小伙伴一定想要把自己一流的技术录制下来,下面便是手机录制的方法.2.首先打开下载安装好的手机录屏工具,会看到录制视频教程所需要的一个基本功能图.3.然后打开之后,我们就可以录制视频了,选择好画质和录

cocos2d-x交叉编译到安卓

ccocos2d-x是一个基于MIT协议的开源框架,用于构建游戏.应用程序和其它图形界面交互应用. 它的最大特点就是跨平台性,支持IOS, Android.Windows, WindowsPhone等诸多平台.能够在创建多平台游戏上节约大量人力.物力.以下.介绍cocos2d-x项目交叉编译到Android平台.生成APK安装文件的过程. 一.交叉编译cocos2d-x到Android须要Java,Python环境,须要先搭建好,这里不再赘述. 二.搭建Eclipse下Android的开发环境(