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