感重力旋转屏幕

这个是效果图,点击这里下载源码;

实现该功能只需要实现三部曲:第一步重写Handler:

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>45&&orientation<135) {
				activity.setRequestedOrientation(8);
			}else if (orientation>135&&orientation<225){
				activity.setRequestedOrientation(9);
			}else if (orientation>225&&orientation<315){
				activity.setRequestedOrientation(0);
			}else if ((orientation>315&&orientation<360)||(orientation>0&&orientation<45)){
				activity.setRequestedOrientation(1);
			}
		}

		super.handleMessage(msg);
	}

}

第二步重写SensorEventListener:

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 + Y*Y;
        // Don't trust the angle if the magnitude is small compared to the y value
        if (magnitude * 4 >= Z*Z) {
            float OneEightyOverPi = 57.29577957855f;
            float angle = (float)Math.atan2(-Y, 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();
		}

	}

}

第三步到MainActivity.java中配置:XXXXXX     ~~~~搞定!

时间: 2024-10-09 20:04:18

感重力旋转屏幕的相关文章

具体怎么使用视频播放屏幕的感重力切换横竖屏

之前 , 只是介绍了一些代码去实现视频播放的平复翻转这一功能!可以随你意进行屏幕的翻转,满足用户的需求.但是,当你真的去做一个像的时候,会有问题出现的哦!那到底是什么问题呢?待我..娓娓道来! 是酱汁的,我在使用视频播放的时候会有点击屏幕切换的按钮来进行屏幕横竖屏的切换播放,当然我还有使用翻转屏幕通过感重力来自动的切换屏幕的横竖屏.那么,问题就出现了,点击按钮和感重力~~~会出现冲突!而冲突是这样子的:当前我将手机处于横屏(竖屏),然后此时的我想通过点击按钮来切换屏幕的方向.那么,你会遇到 我点

自动旋转屏幕默认旋转

如下图所示,在处理屏幕默认旋转方向的时候可以在这里进行选择,上下左右一共是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的列数与宽度能自适应屏幕宽度,每个单元格之间还需要保留一定的间距.因为每款手机的屏幕宽度不都相同,我们在指定了单元格的宽度与间距之后,并不能确定每行中所能容纳的单元格数量,这个数量必须在运行时通过计算得出,同样,我们设置的单元格宽度和间距不能保证刚好容纳在屏幕宽度内,为了解决这个问题,设计了一个简单的算法,首先需要预先指定单元格的宽

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

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

关于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

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

在充电的情况下,玩手机的时候,屏幕一般需要特定的旋转方向. 功能实现分成两部分:一部分根据手机重力方向X,Y,Z得出所需要的角度:另一方面根据旋转角度,设置屏幕旋转方向. 通过监听手机相对于X,Y,Z方向的值,算出绕着某一轴的角度.X,Y方向分别平行于手机界面,Z垂直于手机界面. 本文以绕Y轴旋转为例,如需绕Z轴只需把Y和Z互换,一般情况下只会要求这两种情况. 代码借鉴网上的. package com.gamemaster.orientation; import android.hardware

单击Android设备后退键,主屏幕键以及旋转屏幕如何影响Activity的生命周期

单击设备的后退键,相当于通知Android系统“我已完成activity的使用,现在不需要它了.”接到指令后,系统立即销毁了activity.即调用onPause()->onStop()->onDestroy() 单击主屏幕键,相当于通知Android“我去别处看看,稍后可能回来.”此时,为快速响应随时返回应用,Android只是暂停当前activity而并不销毁它.即调用onPause()->onStop(),但是并没有调用onDestroy(). 注意:停止的activity能够存在