android 竖屏显示
来源:互联网 发布:淘宝在哪修改宝贝 编辑:程序博客网 时间:2024/04/30 07:02
本文转载,来自http://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度)显示了。
- android竖屏显示
- android竖屏显示
- android竖屏显示
- android 竖屏显示
- android竖屏显示
- android竖屏显示
- android 全屏幕显示以及竖屏显示
- android 1.5 之前竖屏显示
- 设置android程序竖屏显示
- android Camera摄像头竖屏显示
- Android设备二维码扫描竖屏显示
- Android------横屏显示
- android横竖屏显示
- android 横屏显示
- android camera 纵屏显示
- Android设置横屏显示
- Android分屏显示LogCat
- Android启动屏全屏显示
- oracle物化视图讲解
- 浅谈数据仓库建设中的数据建模方法
- 游戏里实现碰撞检测方法
- 【转载】丁林松老师的QT视频及教程源码,讲解比较基础适合新手
- Android 2.3状态栏中添加menu home back快捷键
- android 竖屏显示
- 一年的挨踢工作经验!
- Http 的长连接与短连接
- 关于苹果PUSH机制的那点事
- FI--SAP财务成本知识库
- sql server中的触发器
- soapui怎么在restMockService中动态写内容
- Android中在屏幕上涂鸦的例子
- 各种脚本获得自己的进程号