Qt for Android——通过screenOrientation属性设置Android应用的屏幕显示方向

一、前景介绍

       在现在大多数主流的移动APP中,屏幕显示方向基本上都是强制竖屏显示了,所以在大部分情况下,本文的内容都派不上用场。然而在某些时候当我们需要横屏显示界面的时候,我们就需要设置屏幕的显示方向。

       那么在Qt里面是如何做到的呢?首先Qt为我们提供了Qt Android Extras模块,供我们开发Android一些相关的额外功能。我们可以用这个模块提供的类和接口完成很多事情,例如我们现在要做的:对我们的应用进行显示方向的设置和获取。此外我们还需要额外了解一些关于Android开发的知识。

二、Android知识补充

    1. AndroidManifest.xml文件

        关于这个文件在网上和《Qt on Android核心编程》里面都有介绍到,简单讲一下,你可以把它看成是一个配置文件,来配置一些和Android程序相关的信息。每个Android项目都包含了一个这样的文件,我们一会就是通过它来对screenOrientation属性做一个初始值的设置。

        而关于如何创建一个AndroidManifest.xml文件到Qt项目工程中,网上已经有了很多教程,安晓辉老师的那本书里面也有写到,就不再细说了。

    2. Android SDK

        这是安卓的软件开发工具包,主要有四大基本组件:Activity(活动)、Service(服务)、Content Provider(内容提供者)、Broadcast Receiver(广播接收器)。

        我们要设置的screenOrientation属性就要用到Activity,调用getRequestedOrientation()函数和setRequestedOrientation()函数来获取和设置屏幕方向属性。

        而Qt为我们提供了函数,来获取一个可以调用Android SDK中Activity组件的对象。这个函数名叫androidActivity().

三、设置方向

    1. 首先在AndroidManifest.xml文件中配置一个初始的screenOrientation属性值,如下图所示:

        

        这里如果我们不手动设置的话,它的默认值是unspecified,表示由系统方向选择。而我们想强制竖屏显示的话,需要将它的值设为portrait. 然后在程序运行时需要变成横屏显示界面的时候,将值修改为landspace. 关于屏幕属性取值和对应含义在本文最后有详细介绍。

    2. 添加androidextras模块

QT += androidextras

    3. 获取和设置屏幕显示方向

        在代码中动态修改属性值,屏幕显示方向也会随之而改变。

QAndroidJniEnvironment env;
QAndroidJniObject activity = androidActivity();

jint orient = activity.callMethod<jint>( "getRequestedOrientation" );   //调用Android SDK方法,获取当前屏幕显示方向
if(env->ExceptionCheck())       //异常捕获
{
    qDebug() << "exception occured when get";
    env->ExceptionClear();
}
qDebug() << "now screen orientation = " << orient;

orient = 1;     //1表示portrait,竖屏显示
activity.callMethod<void>("setRequestedOrientation", "(I)V", orient);   //调用Android SDK方法,设置屏幕方向
if(env->ExceptionCheck())       //异常捕获
{
    qDebug() << "exception occured when set";
    env->ExceptionClear();
}

        我们首先声明了一个JNI环境的对象env和组件的对象activity,组件上面有说到,而JNI是允许Java代码和其他语言交互的一套东西,全称是Java Native Interface。

        简单讲就是QAndroidJniEnvironment提供了对JNI环境的访问,而关于QAndroidJniObject在Qt文档里面有一句话是这么解释的:All object types are returned as a QAndroidJniObject.所以我们可以用这个类的对象接收任何Java类型的值,但基本数据类型我们用NDK提供的就行了(噢伙计,你竟然不知道NDK?请自行百度吧~),jint就是其中的一种。jint类型在NDK中是这样定义的:typedef int jint; 此外NDK还定义了jboolean、jbyte、jchar、jdouble等等。

        所以在上面的代码中我用env来捕获异常,用activity调Android SDK里Activity组件的函数,然后用jint来接收调用SDK接口的返回值。

        此外这段代码就没什么好讲的了,我们通过get函数来获取当前的屏幕方向,set来设置。对了,第一次get到的返回值使我们最开始在AndroidManifest.xml文件里面配置的,如果我们没有去配置,会默认被配置为unspecified,值为-1.

四、方向属性的取值及其释义的详细说明

    

    ~~~以上就是在Qt for Android的工程中设置屏幕方向的方法,有点啰嗦,如果有错误或者不严谨的地方,请您指正,我一定立正挨打哈哈

发布了16 篇原创文章 · 获赞 15 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/zhounixing/article/details/89679226