android 屏幕旋转

转自:http://blog.csdn.net/oyzhizhong/article/details/8131799

屏是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度)显示了。

时间: 2024-10-21 07:06:18

android 屏幕旋转的相关文章

Android 屏幕旋转适配全解析

原创文章,转载请注明 ( 来自:http://blog.csdn.net/leejizhou/article/details/51233342 李济洲的博客 ) 这篇博文给大家介绍下,当手机屏幕旋转时我们应当怎么去处理,首先了解下默认情况下Android进行屏幕旋转的原理,当手机进行旋转时重力感应sensor起到作用,会将Activity销毁并按照横屏的屏幕尺寸进行重新构造,生命周期如下图所示,一句话总结就是默认情况下Activity进行屏幕旋转会自动进行onDestroy并重新onCreate

Android 屏幕旋转生命周期以及处理方法

工作期间项目需要经常旋转屏幕,还有平板.所以会经常考虑Android 屏幕旋转生命周期,所以也有相应的处理方法.主要有两种办法解决.是根据屏幕旋转的生命周期具体使用.屏幕旋转时候,如果不做任何处理,activity会经过销毁到重建的过程.这种效果都不是想要的. 一.方法一 是在配置文件的activity加上这个 android:configChanges="keyboardHidden|orientation|screenSize"  这句话意思就是配置双引号里面参数意义,软键盘隐藏,

android 屏幕旋转 不重新加载oncreate

当手机设定了使用横屏或者竖屏的时候,还想要使用重力感应,可以设置activity属性 android:screenOrientation="sensor" 但是每次翻转屏幕,都会重新调用oncreate,要想不重新加载程序的话,需要使用如下设置android:configChanges="orientation|keyboardHidden|screenSize" android 屏幕旋转 不重新加载oncreate

Android 屏幕旋转 处理 AsyncTask 和 ProgressDialog 的最佳方案

出处:http://blog.csdn.net/lmj623565791/article/details/37936275 1.概述 众所周知,Activity在不明确指定屏幕方向和configChanges时,当用户旋转屏幕会重新启动.当然了,应对这种情况,Android给出了几种方案: a.如果是少量数据,可以通过onSaveInstanceState()和onRestoreInstanceState()进行保存与恢复. Android会在销毁你的Activity之前调用onSaveInst

android屏幕旋转切换设置

<activity android:name=".VideoCourseDetailActivity" android:configChanges="keyboardHidden|orientation|screenSize" > setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT); setRequestedOrientation(ActivityInfo.SCREEN_OR

Android实例-Delphi在运行时更改Android屏幕旋转(IOS也支持,但还没有写,下午我回来加上。不过我可没有苹果机,测试不了)

相关资料: https://www.it1352.com/624177.html 1 unit Unit2; 2 3 interface 4 5 uses 6 System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants, 7 FMX.Types, FMX.Controls, FMX.Forms, FMX.Graphics, FMX.Dialogs, FMXTee.Engine, 8 FMXTee.P

【Android】11.3 屏幕旋转和场景变换过程中GridView的呈现

分类:C#.Android.VS2015: 创建日期:2016-02-21 一.简介 实际上,对于布局文件中的View来说,大多数情况下,Android都会自动保存这些状态,并不需要我们都去处理它.这一节仍以GridView为例(第10章已经介绍过其基本用法了),说明屏幕旋转以及场景切换过程中用GridView呈现的图像是如何自动变换的. 本节主要关注下面的问题: (1)如何通过GridView显示多幅图像. (2)如何使用Activity从一个活动切换到另一个活动,即利用Activity实现场

Qt for Android 程序禁止屏幕旋转

有时候我们希望让一个程序的界面始终保持在一个方向,不随手机(平板)方向旋转而变化:在AndroidManifest.xml的每一个需要禁止转向的Activity配置中加入 android:screenOrientation=”landscape” 属性. landscape = 横向 portrait = 纵向 原创文章,转载请注明: 转载自 http://www.mr-wu.cn/ 吴川斌的博客 本文链接地址: Qt for Android 程序禁止屏幕旋转 http://www.mr-wu.

Android 设定横屏,禁止屏幕旋转,Activity重置 [更新视频播放器相关]

1. 设定屏幕方向 当指定了屏幕的方向后(非SCREEN_ORIENTATION_UNSPECIFIED),屏幕就不会自己主动的旋转了 有2中方式控制屏幕方向: 1.1 改动AndroidManifest.xml 在AndroidManifest.xml的activity中增加: 横屏: android:screenOrientation="landscape" 竖屏: android:screenOrientation="portrait" 1.2 setRequ