1. 程式人生 > >android螢幕旋轉在framework中的修改。

android螢幕旋轉在framework中的修改。

在eoeandroid上寫, 記錄過來。

   在framework中修改,可以隨意修改螢幕0°指向的方向,其實也是framework層做的對映。 修改HAL層來修改螢幕0°指向的方向應該也是可以的,還沒有試過, 估計會複雜點,應該要修改觸控式螢幕的座標, 觸控鍵值對映表, 比較麻煩,其實沒什麼必要,修改framework層就可以搞定了。

平板電腦一般是預設橫屏, 豎屏的APP程式, 會自動旋轉90°, 由於是順時針轉90°, 需要改為逆時針轉90°; 也就是要把portrait改逆時針轉90°,這樣就和手機一致,相容很多gsensor遊戲, 修改點如下:

PhoneWindowManager.java(//192.168.1.4/opt/android_froyo_smdk/frameworks/policies/base/phone/com/android/internal/policy/impl)


public int rotationForOrientationLw(int orientation, int lastRotation,


boolean displayEnabled) {


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_270;//Surface.ROTATION_90;


mLandscapeRotation =Surface.ROTATION_0;


} else {


mPortraitRotation =Surface.ROTATION_0;


mLandscapeRotation = Surface.ROTATION_270;//Surface.ROTATION_90;


}


}

一下是參考文章------------------------------------------------------------------------------------------------------

本行實現以後才發現,google在1.5到2.2這個過程中改進了很多,1.5修改豎屏比較麻煩,而2.2是相當的容易!
其實基本上google將之前版本的預設為豎屏的做法進行了改進,不需要再花費更多力氣在螢幕的預設橫豎切換上面。1.還是kernel豎屏,可以顯示到螢幕出現"A N D R O I D"字樣
  啟動引數里加入fbcon=rotate:1    (0:正常屏; 1:順時鐘轉90度; 2:轉180度; 3:順時鐘轉270度;)
最後生成的autoconf.h裡有類似項:
#define CONFIG_CMDLINE "console=ttySAC0,115200 fbcon=rotate:1"此項的解析在$(kernel)/drivers/video/console/fbcon.c
static int __init fb_console_setup(char *this_opt);
只是去初始化變數initial_rotation,然後initial_rotation會傳遞給其他需要的結構。
要選上:Device Drivers -> Graphics support -> Console display driver support ->Framebuffer Console support -> Framebuffer Console Rotation
注意:參考$(kernel)/documentation/fb/fbcon.txt2.android OS旋轉螢幕
froyo中已經相當容易,僅修改一處:
frameworks/base/libs/surfaceflinger/SurfaceFlinger.cpp
void GraphicPlane::setDisplayHardware(DisplayHardware *hw)
{
    mHw = hw;    // initialize the display orientation transform.
    // it's a constant that should come from the display driver.
//    int displayOrientation = ISurfaceComposer::eOrientationDefault;
    int displayOrientation = ISurfaceComposer::eOrientation90; //jeff.
    。。。
}
或者只在init.rc中增加一項:
setprop ro.sf.hwrotation 90就這麼簡單的一修改,就可以全程豎屏顯示了!