閱讀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 情色網站的另一麵:請尊重你不懂的領域