android之Display.getRotation()_传感器控制屏幕旋转

在看android自带的samples源码里面的AccelerometerPlayActivity时,看到下面这段代码,很不理解public void onSensorChanged(SensorEvent event) { if(event.sensor.getType() != Sensor.TYPE_ACCELEROMETER){ return; } switch (m

大家好,又见面了,我是全栈君。

在看android自带的samples源码里面的AccelerometerPlayActivity时,看到下面这段代码,很不理解

public void onSensorChanged(SensorEvent event) {
	if(event.sensor.getType() != Sensor.TYPE_ACCELEROMETER){
		return;
	}
	switch (mDisplay.getRotation()) {
	    case Surface.ROTATION_0://手机处于正常状态
                  mSensorX = event.values[0];
                mSensorY = event.values[1];
                break;
            case Surface.ROTATION_90://手机旋转90度
                  mSensorX = -event.values[1];
                mSensorY = event.values[0];
                break;
            case Surface.ROTATION_180:
                mSensorX = -event.values[0];
                mSensorY = -event.values[1];
                break;
            case Surface.ROTATION_270:
                mSensorX = event.values[1];
                mSensorY = -event.values[0];
                break;
	}
}

经过查阅资料大体了解了
       通过AndroidManifest.xml设置屏幕方向的话,安装后就不能改变,而程序内部设置屏幕方向就不会有这个限制。主要靠这两个API:getRequestedOrientation()和setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT)这两个API通过ActivityManagerService.java的转换后,实际上都是调用的WindowManagerService的同名方法。

每个Activity在WindowManagerService端都有一个AppWindowToken做代表,而屏幕的方向信息就存储在这里。
PhoneWindowManager会自动根据屏幕物理特性决定屏幕方向,看这段代码:

if (mPortraitRotation < 0) {  
    // Initialize the rotation angles for each orientation once.   
    Display d = ((WindowManager)mContext.getSystemService(Context.WINDOW_SERVICE))  
            .getDefaultDisplay();  
    if (d.getWidth() > d.getHeight()) {  
        mPortraitRotation = Surface.ROTATION_90;  
        mLandscapeRotation = Surface.ROTATION_0;  
        mUpsideDownRotation = Surface.ROTATION_270;  
        mSeascapeRotation = Surface.ROTATION_180;  
    } else {  
        mPortraitRotation = Surface.ROTATION_0;  
        mLandscapeRotation = Surface.ROTATION_90;  
        mUpsideDownRotation = Surface.ROTATION_180;  
        mSeascapeRotation = Surface.ROTATION_270;  
    }  
}  

这里的d.getWidth() 和 d.getHeight()得到的是物理屏幕的宽高。一般来说,平板和手机的是不一样的。

平板是宽比高大(0度时位于landscape模式,右转90度进入porit模式),手机是高比宽大(0度是位于porit模式,右转90度进入landscape模式)。如果应用程序只关心当前是横屏还是竖屏,而不直接使用传感器的话,没什么问题。如果像依靠重力感应的游戏那样直接使用传感器,就需要自己根据物理屏幕的坐标系对传感器数据做转化,否则就会出现坐标系混乱的问题。

如果没有没有通过上面的d.getWidth()和d.getHeight()来检测设备的物理屏幕从确定哪个是landscape和porit模式,而是直接假设设备是和手机一样的模式。由于游戏运行在landscape模式下,它们都把传感器数据右转90度。这样做法在手机上是没有问题,但在平板电脑上是不应该转化的,这是因为物理屏幕宽比高大的情况下,默认就是landscape模式。

 

现在回到源代码,在这里没有区分手机和平板,仅仅是用来转换加速度的方向而已,也没有必要区分.

case Surface.ROTATION_0://手机处于正常状态
                mSensorX = event.values[0];
                mSensorY = event.values[1];
                break;

这段就是如果手机的方向没有旋转,不管手机处于landscape还是porit模式,加速度的方向都不用变,而下面,如果手机旋转了180度,说明x轴和y轴的方向完全反过来了,这时候对于加速度的方向就要调整到反向.还有90度和270度的情况都类似.

case Surface.ROTATION_180:
                mSensorX = -event.values[0];
                mSensorY = -event.values[1];
                break;

 

 

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/121436.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 人力外包 vs 软件外包

    人力外包 vs 软件外包A公司:大外包公司,人力外包,号称有7000多员工,外派某国内银行IT部门工作,开工资10KB公司:小外包公司(外企性质,需要英语能力),软件外包(类似竞标,把项目拿到本公司来做),200员工,发包方是国外大银行,开工资12K。PS:6年JAVA经验这个该选那个好?从职业生涯、稳定性等方面考虑!…

    2022年5月19日
    39
  • Hadoop与Spark等大数据框架介绍[通俗易懂]

    Hadoop与Spark等大数据框架介绍[通俗易懂]海量数据的存储问题很早就已经出现了,一些行业或者部门因为历史的积累,数据量也达到了一定的级别。很早以前,当一台电脑无法存储这么庞大的数据时,采用的解决方案是使用NFS(网络文件系统)将数据分开存储。但是这种方法无法充分利用多台计算机同时进行分析数据。一个实际的需求场景:日志分析日志分析是对日志中的每一个用户的流量进行汇总求和。对于一个日志文件,如果只有这么几行数据,我们一般会采用这…

    2022年4月28日
    43
  • ubuntu clion 2020 永久激活码_通用破解码

    ubuntu clion 2020 永久激活码_通用破解码,https://javaforall.net/100143.html。详细ieda激活码不妨到全栈程序员必看教程网一起来了解一下吧!

    2022年3月16日
    180
  • 安卓编程用什么软件_如何用手机进行编程?有哪些值得推荐的软件?

    安卓编程用什么软件_如何用手机进行编程?有哪些值得推荐的软件?手机上可以编程的软件其实有很多,有付费的也有免费的,这里简单介绍几个免费的手机编程软件,主要分为C/C++、Java、Python、Html和Linux5个方面,感兴趣的朋友可以自己下载尝试一下,主要内容如下:C/C++这里介绍一个手机软件—C++编译器,可以直接编辑运行C/C++代码,代码高亮,自带有语法检查功能,使用起来非常不错,下面我简单介绍一下这个软件:1.首先,安装C++编译器,这个直接…

    2022年5月24日
    43
  • pycharm运用_python界面开发

    pycharm运用_python界面开发PyCharm是由JetBrains团队研发的用于开发python应用程序的IDE,与IDEA一脉相承首先打开PyCharm的下载地址 https://www.jetbrains.com/pycharm/download/  点击download下载专业版:这时会跳到一个感谢界面,不必理睬,耐心等待下载完成就可以了:下载完的安装程序是这样的:双击安装,点击

    2022年8月28日
    4
  • 什么是Boot Loader

    什么是Boot Loader

    2021年7月31日
    47

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号