首页 > 其他分享 >Qt Android 实现全屏

Qt Android 实现全屏

时间:2024-07-28 18:50:26浏览次数:10  
标签:JFullScreen Qt void SYSTEM FLAG UI 全屏 Android View

本文内容参考自:https://blog.csdn.net/jun4331247/article/details/80739662

1.新建JFullScreen.java,添加以下代码,放置在QT安装目录\android_armv7\src\android\java\src\org\qtproject\qt5\android\bindings

package org.qtproject.junj;

import android.app.Activity;
import android.content.Context;
import android.util.Log;
import android.view.View;

public class JFullScreen {
    static final private String TAG = "JFullScreen";
    static private JFullScreen mInstance = new JFullScreen();
    private Context mContext = null;

    private JFullScreen() { }

    static public JFullScreen instance() { return mInstance; }

    public void setContext(Context context) {
        Log.d(TAG, "context: " + context.toString());
        mContext = context;
    }


    public void fullScreenLeanBack() {
        Log.d(TAG, "fullScreenLeanBack");
        Activity activity = (Activity) mContext;
        View decorView = activity.getWindow().getDecorView();
        decorView.setSystemUiVisibility(
                View.SYSTEM_UI_FLAG_LAYOUT_STABLE
                        | View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
                        | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
                        | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION
                        | View.SYSTEM_UI_FLAG_FULLSCREEN);
    }

    public void fullScreenImmersive() {
        Log.d(TAG, "fullScreenImmersive");
        Activity activity = (Activity) mContext;
        View decorView = activity.getWindow().getDecorView();
        decorView.setSystemUiVisibility(
                View.SYSTEM_UI_FLAG_IMMERSIVE
                        | View.SYSTEM_UI_FLAG_LAYOUT_STABLE
                        | View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
                        | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
                        | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION
                        | View.SYSTEM_UI_FLAG_FULLSCREEN);
    }

    public void fullScreenStickyImmersive() {
        Log.d(TAG, "fullScreenStickyImmersive");
        Activity activity = (Activity) mContext;
        View decorView = activity.getWindow().getDecorView();
        decorView.setSystemUiVisibility(
                View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY
                        | View.SYSTEM_UI_FLAG_LAYOUT_STABLE
                        | View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
                        | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
                        | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION
                        | View.SYSTEM_UI_FLAG_FULLSCREEN);
    }

    public int addTest(int value0, int value1) {
        Log.d(TAG, "I'm a test.");
        return value0 + value1;
    }
}

2.  .pro文件新增:+= androidextras

3.使用JNI写调用Java代码的C++类

  这里主要使用QAndroidJniObject类来实现调用Java代码,并使用QtAndroid::runOnAndroidThread让代码执行在UI线程。

jfullscreen.h

#ifndef JFULLSCREEN_H
#define JFULLSCREEN_H

#include <QAndroidJniObject>

class JFullScreen
{
public:
    JFullScreen();
    void fullScreenLeanBack();
    void fullScreenImmersive();
    void fullScreenStickyImmersive();
    int addTest(int value0, int value1);

private:
    QAndroidJniObject _javaClass;
};

#endif // JFULLSCREEN_H

jfullscreen.cpp

#include "jfullscreen.h"

#include <functional>
#include <QtAndroid>

// JFS: JFullScreen
#define JFS_CLASSNAME "org/qtproject/junj/JFullScreen"
#define JFS_SIGNTURE_INSTANCE "()Lorg/qtproject/junj/JFullScreen;"

void realFullScreenLeanBackMethod() {
    QAndroidJniObject javaCustomFunction = QAndroidJniObject::callStaticObjectMethod(JFS_CLASSNAME, "instance", JFS_SIGNTURE_INSTANCE);
    javaCustomFunction.callMethod<void>("fullScreenLeanBack", "()V");
}
void realFullScreenImmersiveMethod() {
    QAndroidJniObject javaCustomFunction = QAndroidJniObject::callStaticObjectMethod(JFS_CLASSNAME, "instance", JFS_SIGNTURE_INSTANCE);
    javaCustomFunction.callMethod<void>("fullScreenImmersive", "()V");
}
void realFullScreenStickyImmersiveMethod() {
    QAndroidJniObject javaCustomFunction = QAndroidJniObject::callStaticObjectMethod(JFS_CLASSNAME, "instance", JFS_SIGNTURE_INSTANCE);
    javaCustomFunction.callMethod<void>("fullScreenStickyImmersive", "()V");
}

JFullScreen::JFullScreen()
{
    if(!QAndroidJniObject::isClassAvailable(JFS_CLASSNAME)) {
        qDebug("JFullScreen is unavailable.");
        return;
    }

    _javaClass = QAndroidJniObject::callStaticObjectMethod(JFS_CLASSNAME, "instance", JFS_SIGNTURE_INSTANCE);

    if(!_javaClass.isValid()) {
        qDebug(" JFullScreen instance is invalid.");
    }

    _javaClass.callMethod<void>("setContext", "(Landroid/content/Context;)V", QtAndroid::androidActivity().object<jobject>());
}

//use runOnAndroidThread() in order to run on android ui thread
void JFullScreen::fullScreenLeanBack()
{
    QtAndroid::Runnable runnable = realFullScreenLeanBackMethod;
    QtAndroid::runOnAndroidThread(runnable);
}

void JFullScreen::fullScreenImmersive()
{
    QtAndroid::Runnable runnable = realFullScreenImmersiveMethod;
    QtAndroid::runOnAndroidThread(runnable);
}

void JFullScreen::fullScreenStickyImmersive()
{
    QtAndroid::Runnable runnable = realFullScreenStickyImmersiveMethod;
    QtAndroid::runOnAndroidThread(runnable);
}

int JFullScreen::addTest(int value0, int value1)
{
    jint sum = _javaClass.callMethod<jint>("addTest", "(II)I", value0, value1);
    return sum;
}

4.添加jfullscreen.cpp、jfullscreen.h到工程

5.测试

创建一个JFullScreen进行测试。

    JFullScreen *pManager = new JFullScreen;
    int sum = pManager->addTest(1, 2);
    Q_ASSERT(sum == 3);
//    pManager->fullScreenLeanBack();
//    pManager->fullScreenImmersive();
    pManager->fullScreenStickyImmersive();

后记,三种全屏模式

1. Lean Back
Lean Back模式应用在不需要用户频繁的点击屏幕的情形下,比如视频播放APP。该模式下,用户只需要单击屏幕,System bar将会自动显示处理,无需做更多的操作。

2.Immersive
Immersive模式应用在用户需要频繁与屏幕交互的情形下,比如游戏,图片浏览,阅读等等。该模式下,用户需要在屏幕边缘向内滑动才能呼出system bar。

3. Sticky immersive
Sticky immersive模式与Immersive模式的区别是:System bar 呼出时,System bar是半透明显示的, 同时System bar会自动隐藏。这种模式的好处是如果用户误操作导致system bar显示出来后,无需做什么其它操作,system bar会自动隐藏,在有些引用场景下,这是一个比较好的用户体验。

标签:JFullScreen,Qt,void,SYSTEM,FLAG,UI,全屏,Android,View
From: https://www.cnblogs.com/xiaofakun/p/18328684

相关文章

  • 实战|Qt开发WordBN笔记软件#10 添加Font Awesome字体图标
    01背景【WordBN字远笔记】是天恩软件工作室开发的一款免费笔记软件;WordBN基于VS2019、Qt6.5开发,使用QtQuick(QML)开发语言。本课程将以【WordBN字远笔记】的界面为实战基础,详细介绍如何基于Qt/QML开发语言,从零开始开发一套真正的程序,包括国际化、版本发布、安装包制作等项目......
  • 【QT】QT 系统相关(事件、文件、多线程、网络、音视频)
    一、Qt事件1、事件介绍事件是应用程序内部或者外部产生的事情或者动作的统称。在Qt中使用一个对象来表示一个事件。所有的Qt事件均继承于抽象类QEvent。事件是由系统或者Qt平台本身在不同的时刻发出的。当用户按下鼠标、敲下键盘,或者是窗口需要重新绘制的时候,都会发......
  • Termux Android 应用程序中 Twine 安装错误
    我想在TermuxAndroid应用程序中安装tine模块。但我发现了这个错误。截图如下。`如果您确实打算从源代码构建此软件包,请尝试从系统软件包管理器安装Rust编译器,并确保它在安装过程中位于PATH中。或者,建议使用rustup(可在https://rustup.rs......
  • 如何在 Python 中从 Milesight TrafficX 摄像头、Post(MQTT、TCP/IP、HTTP) 获取数据?
    你好,祝你度过愉快的一天或一夜,我有这个MilesightTrafficX摄像头已启动并正在运行,仪表板中有一个名为POST的设置,您可以在下图中看到:我想要的是知道如何设置这些设置(基于实际上我的意思是)能够在我的Python代码中接收数据。无论协议如何,数据都将如下所示:......
  • 如何利用PyQt实现列表添加删除排序功能?
    本文介绍如何实现列表增加删除和排序的功能,效果如下:1页面设计1.1列表#列表数据 self.list=['福宝','萌兰','金虎','蓝天']#创建四行一列标准数据模型self.mode=QStandardItemModel(4,1)#将数据中的列表项作为标准数据模型输出......
  • Qt连接GPS模块实现调用高德地图交互显示经纬度信息的功能
    最近需要设计一个qt界面,在里面通过串口接收并解析出gps模块的经纬度信息,再通过调用高德地图的api进行地图的显示,作为入门qt的项目踩了不少坑,特将这个项目开源出来,供初学者参考学习。项目链接放下边啦,欢迎大家star~https://github.com/daviddou2023/qt_screen_gps一.项目简介......
  • QT实现windows窗口内嵌
    appQSharedMemoryshared("appID");//attach成功表示已经存在该内存了,表示当前存在实例if(shared.attach())//共享内存被占用则直接返回return0;MainWindoww;w.show();qulonglongwinID=(qulonglong)w.winId();shared.cr......
  • GraphHopper路劲规划导航(Android源码调试运行)
    本文主要记录在运行graphhopper安卓版路径规划导航源码的步骤和遇到的问题。成功运行了程序,但是路劲规划一直不成功,问题一开始是服务地址,后来又是key的问题,在这个项目中涉及到了graphhopper、mapbox、mapilion的key,mapbox带导航的key我一直无法获取。目前最大的问题:我无法......
  • 我的新书《Android系统多媒体进阶实战》正式发售了!!!
    我的新书要正式发售了,把链接贴在下面,感兴趣的朋友可以支持下。❶发售平台:当当,京东,抖音北航社平台,小红书,b站❷目前当当和京东已开启预售❸当当网https://u.dangdang.com/KIDHJ❹京东商城https://item.m.jd.com/product/10109083199634.html?gx=RnAoqRAjajbdh8lR5Q&gxd......
  • Android中Service学习记录
    目录一概述二生命周期2.1启动服务startService()2.2绑定服务bindService()2.3先启动后绑定2.4先绑定后启动三使用3.1本地服务(启动式)3.2可通信的服务(绑定式)3.3前台服务3.4IntentService总结参考一概述Service组件一般用来执行长期在后台的任务,如播放音......