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