`
king_tt
  • 浏览: 2112696 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

android 竖屏显示

 
阅读更多

本文转载,来自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 竖屏二维码扫描

    使用google提供的ZXing的jar包,代码简单化过后的,并且是竖屏的哦,一般网上都有实现这个二维码扫描的但是存在两个问题,1,不兼容三星手机 2.按照网上的说法改为竖屏后不能再识别了;我的这个源码完全解决了这些...

    让AndroidX86竖屏显示

    让AndroidX86竖屏显示,默认情况下该版本Android是横屏显示,此文档可以帮你设置能竖屏显示

    android竖屏录制视频

    android利用mediarecorder来录制视频,调用camera,同时调整摄像头的方向为竖屏,录制完成的视频也是竖屏显示的。

    android 摄像头、视频录制demo (竖屏)

    android 摄像头、视频录制demo (竖屏) 预览时候竖屏显示,以及拍照图片时候保存竖屏,视频录制竖屏预览,以及保存的文件在PC端也是跟预览时候一致不会偏置90度

    Android 简单例子:横屏 竖屏切换.rar

    Android 简单例子:横屏 竖屏切换功能实例,当屏幕为横屏时,可将屏幕切换成竖屏状态,并检测屏幕是否切换成功。反之,当屏幕为竖屏时切换为横屏显示。

    android竖屏切换横屏

    基于mtk平台,手机平台默认竖屏显示,根据此提取包可以要做成横屏模式。

    Fragment的使用,隐藏显示以及androidPad横竖屏切换

    各个碎片之前的切换隐藏显示,以及androidPad横竖屏切换的使用demo

    android 判断横竖屏问题的详解

    Android横竖屏要解决的问题应该就两个:一。布局问题;... “landscape” 横屏显示(宽比高要长) “portrait” 竖屏显示(高比宽要长) “user” 用户当前首选的方向 “behind” 和该Activity下面的那个Act

    Android编程判断横屏、竖屏及设置横竖屏的方法

    还是这个手机项目,有一个需求是整个工程中只有刚进去的界面允许横屏显示,并且要将该界面的标题隐藏,当切换回竖屏显示的时候,标题变为可见,一开始我百度了一下有一个监听activity是否横屏竖屏的监听函数,如下:...

    Android之横竖屏切换

    android:screenOrientation属性,有以下几个参数: "landscape": 横屏显示 (宽比高长) "portrait": 竖屏显示 (高比宽长)

    Android Studio平板模拟器横屏竖屏调整

    而我希望平板是横屏的,来查看fragment在宽屏上的应用效果,这竖屏的平板感觉只是放大版的手机~ 本来设计的两个fragment在竖屏的平板上看都“太瘦”了,反而有些奇怪,影响学习体验。 搜索博客找解决方案,上面全都...

    XE10 Android Zxing 实现竖屏扫二维码.docx

    仿微信操作文档,详细介绍了在deLphixe 环境下,调用Zxing 显示横屏转换成竖屏扫描的详细操作说明,结合网上一些例子和台北一些前辈指点后进行整理,希望对你有所帮助。

    android图库竖屏不显示status bar的解决方法

    图库在JB和JB2的版本上显示的行为是:横屏全屏显示,竖屏会显示status bar,图库在JB和JB2的版本上显示的行为是:横屏全屏显示,竖屏会显示status bar,具体实现方法如下,不会的朋友可以参考下哈

    解析Android横竖屏切换的问题

    在竖屏时怎么显示),当然最简单的办法就是在项目的 AndroidManifest.xml中找到你所指定的activity 中加上 只竖屏显示的话(android:screenOrientation=”portrait”) 只横屏显示的话(android:screenOrienta

    Android开发强制横屏和强制竖屏设置实例代码

    强制竖屏设置 1.代码在Activity的onResume方法中添加如下代码 @Override protected void onResume() { /** * 设置为横屏 */ if (getRequestedOrientation() != ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE) {...

    Android横竖屏切换及其对应布局加载问题详解

    1)在res目录下建立layout-land和layout-port目录,相应的layout文件名不变,比如:layout-land是横屏的layout,layout-port是竖屏的layout,其他的不用管,横竖屏切换时程序调用Activity的onCreate方法中的...

    android9.0 高通平台修改屏幕默认为横屏显示源码

    高通平台 android9.0默认为竖屏,附件通过修改android源码修改屏幕默认为横屏显示源码

    安卓条码扫描二维码相关-支持竖屏平板和只有前置摄像头的android二维码扫描demo修复后.zip

    支持竖屏、平板和只有前置摄像头的android二维码扫描demo(修复后).zip,太多无法一一验证是否可用,程序如果跑不起来需要自调,部分代码功能进行参考学习。

    Android 横竖屏切换

    Android 横竖屏切换 利用Android系统每次屏幕切换会重启Activity的特性,在OnCreat处自动加载不同显示状态下的layout。

    Android开发丶基于mupdf在Android设备上横竖屏查阅pdf文件

    项目中有个需求,需要下载pdf文件后查看,而且要完成首尾页跳转,横竖屏查看,恢复屏幕缩放比例的功能,查阅了相关的资料,发现相对比较缺失,大概是市面上相关需求不多,不过既然我们接到了这个需求,就要把它实现...

Global site tag (gtag.js) - Google Analytics