阅读998 返回首页    go 阿里云 go 技术社区[云栖]


Android旋转屏幕研究

https://wenku.baidu.com/view/14783db665ce050876321307.html


android2.2怎么根据重力感应来改变布局呢,我们来详细分析一下WindowOrientationListener.java这个文件

这个文件里有个重要的概念和两个重要的数组,对于我们理解翻转手机带来屏幕布局变化有很大帮助

一个概念:布局方式

在android2.2官方系统中有三种布局方式,分别叫做ROTATION_0, ROTATION_90, ROTATION_270,不要把后面的0,90,270与后面我们即将提到的角度值混淆,这里的0,90,270就是个名称,跟A,B,C没什么区别,只是告诉我们这是一种布局方式,本段的核心就是研究在什么情况下采用哪一种布局方式。

两个数组:THRESHOLDS, ROTATE_TO

              先看两个数组的定义

Private final int[][][] THRESHOLDS = newint[][][] {

       {{60,180}, {180, 300}},

       {{0,45}, {45, 165}, {330, 360}},

       {{0,30}, {195, 315}, {315, 360}}

}

 

Private final int[][] ORTATE_TO = newint[][] {

       {ROTATION_270,ROTATION_90},

       {ROTATION_0,ROATION_270, ROATION_0},

       {ROATION_0,ROTATION_90, ROATION_0}

}

 

THRESHOLDS的基本元素是数值,实际上是代表角度,0~360正好代表一个圆周;

ROTATE_TO的基本元素是布局方式。

 

这两个数组正好组成一个映射关系如下:

布局

遇到角度

遇到角度

遇到角度

转化成另外的布局

转化成另外的布局

转化成另外的布局

 

 

 

 

ROTATION_0

60-180

180-300

 

ROTATION_270

ROTATION_90

 

 

 

 

 

ROTATION_90

0-45

45-165

330-360

ROTATION_0

ROTATION_270

ROTATION_0

 

 

 

 

ROTATION_270

0-30

195-315

315-360

ROTATION_0

ROTATION_90

ROTATION_0

 

我们从角度开始研究

 

Android系统中,手机的角度如下图所示

 

当手机的speaker在上方(天空的方向)时,手机所在角度为0°,朝右为90°,朝下为180°,朝左为270°。

 

手机为0°,是我们常用的方向,对应的布局为ROTATION_0,根据映射关系发现:

当角度在60-180之间时,转变布局为ROTATION_270;

转过180到了180-300之间时,改变布局为ROATION_90;

如果是在300-360,0-60之间,则不做改变。

 

可以发现,三种布局把整个圆周三分天下,每个布局占据120度,300-360和0-60这个区间内为布局ROTATION_0,60-180这个区间为布局ROTATION_270,180-300这个区间的布局为ROTATION_90。 有了这个基本的认识,再看映射表的其余部分就简单多了

 

手机在270度方向时,对应的布局为ROTATION_90,根据映射关系:

当角度变为0-45和330-360的时候,改变布局为ROTATION_0;

当角度变为45-165的时候,改变布局为ROTATION_270;

当角度在165-330这个区间,则布局不变。

 

手机在90度方向时,对应的布局为ROTATION_270,根据映射关系:

当角度变为0-30和315-360的时候,改变布局为ROTATION_0;

当角度变为195-315的时候,改变布局为ROTATION_90;

当角度在30-195这个区间,则布局不变。

 

 

有兴趣的开发者可以把后两种转换情况的图形也画出来。根据这几个数值,可以谨慎推断android这么做的思路:

当正常拿着手机的时候,即布局为ROTATION_0时,会根据等分的120度来判断改变成哪个布局;

当横着拿手机,即布局为ROTATION_90或者ROTATION_270时,布局改变的条件就要苛刻一些,改回ROTATION_0的条件尤其苛刻(角度范围跨度只有75度)。

 

有了上面的认识,我们想把布局缩减为2种或者增加为4种就可以方便的改变数组来实现。

 


最后更新:2017-04-03 18:51:58

  上一篇:go Java多线程(二)、启动一个线程的3种方式
  下一篇:go 情色网站的另一面:请尊重你不懂的领域