android橫豎屏顯示
來自https://blog.csdn.net/knock,轉載請保留本行
屏是LANDSCAPE的,要讓它默認顯示為PORTRAIT.
1.kernel裏要旋轉FrameBuffer.
啟動參數裏加入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會傳遞給其他需要的結構。
注意:參考$(kernel)/documentation/fb/fbcon.txt
2.android OS旋轉屏幕
係統默認是針對豎屏的,而MID使用的是橫屏,所以需要做一個轉換的動作。
PORTRAIT LANDSCAPE <------屏幕顯示方式
ROTATION_0 ROTATION_90
ROTATION_90 ROTATION_180
ROTATION_180 ROTATION_270
ROTATION_270 ROTATION_0
而source code裏對ROTATION_180和ROTATION_270的處理比較少,隻在sensor和KeyQueue部分,所以如果隻是要讓係統顯示為豎屏,將android中的Surface.ROTATION_0改為Surface.ROTATION_90,而Surface.ROTATION_90改為Surface.ROTATION_0。 這樣,啟動後的屏幕就是豎屏的了。
改動後,啟動時還是LANDSCAPE顯示的,進入HOME也是,很快就會自動旋轉到PORTRAIT模式,這是由於
$(cupcake)/frameworks/base/services/java/com/android/server/WindowManagerService.java
中enableScreenAfterBoot()->performEnableScreen()->mPolicy.enableScreenAfterBoot(), mPolicy為父類指針,可以指向
PhoneWindowManager或者MidWindowManager,由配置文件$(cupcake)/build/target/product/core.mk中
PRODUCT_POLICY := android.policy_phone
//PRODUCT_POLICY := android.policy_mid
來指定。
PhoneWindowManager::enableScreenAfterBoot()->updateRotation(Surface.FLAGS_ORIENTATION_ANIMATION_DISABLE)->mWindowManager.setRotation()完成設置旋轉並清除LOGO.
3.啟動過程中豎屏
啟動過程中,默認是按照屏的width和height顯示的,不會旋轉,要使它顯示logo時就是豎屏的,也就是旋轉90度,需要做如下工作:
$(cupcake)/frameworks/base/libs/surfaceflinger/SurfaceFlinger.cpp
status_t SurfaceFlinger::readyToRun()中
//const uint32_t w = hw.getWidth();
//const uint32_t h = hw.getHeight();
//swap w&h for portrait display in landscape panel. jeff.
const uint32_t h = hw.getWidth();
const uint32_t w = hw.getHeight();
交換一下width和height,這樣後麵用OpenGL創建的ViewPort形狀就是豎的了。修改後麵的函數參數也可以,不過太多了,交換一下省事。但是怎麼讓這個豎的viewport旋轉90度呢?這裏就要用到GraphicPlane::mGlobalTransform這個Transform了。它指示當前最終要旋轉的結果。 所以要在創建GraphicPlane時初始化mGlobalTransform為旋轉90度。
GraphicPlane::GraphicPlane()
: mHw(0)
{
//add by jeff. for default rotate angel 90
mOrientationTransform.reset();
mOrientation = ISurfaceComposer::eOrientation90;
mGlobalTransform = mOrientationTransform * mTransform;
}
此段從status_t GraphicPlane::setOrientation(int orientation)複製過來,注意修改mGlobalTransform:
if (orientation == ISurfaceComposer::eOrientation90) { //ISurfaceComposer::eOrientationDefault //jeff
// make sure the default orientation is optimal
mOrientationTransform.reset();
mOrientation = orientation;
//mGlobalTransform = mTransform;
mGlobalTransform = mOrientationTransform * mTransform; //jeff
return NO_ERROR;
}
注意mOrientationTransform.reset();要修改為默認旋轉90度。參照status_t GraphicPlane::orientationToTransfrom
中的設置,修改為:
void Transform::reset() {
mTransform.reset();
mType = 0;
set(0,-1,1,0); //jeff
set(800,0);
}
參考:
status_t GraphicPlane::orientationToTransfrom(
int orientation, int w, int h, Transform* tr)
{
float a, b, c, d, x, y;
switch (orientation) {
case ISurfaceComposer::eOrientationDefault:
a=1; b=0; c=0; d=1; x=0; y=0;
break;
case ISurfaceComposer::eOrientation90:
a=0; b=-1; c=1; d=0; x=w; y=0;
break;
case ISurfaceComposer::eOrientation180:
a=-1; b=0; c=0; d=-1; x=w; y=h;
break;
case ISurfaceComposer::eOrientation270:
a=0; b=1; c=-1; d=0; x=0; y=h;
break;
default:
return BAD_VALUE;
}
tr->set(a, b, c, d);
tr->set(x, y);
return NO_ERROR;
}
修改之後,默認就是豎屏(旋轉90度)顯示了。
最後更新:2017-04-03 14:53:52