Привет! Я уверен, что многие слышали, что Qt очень хорош для кроссплатформенной разработки мобильных приложений.
Однако для решения некоторых задач приходится иметь дело с нативным кодом (Java, Objective-C), например вызов камеры, галереи, вызов стороннего API. В этой статье на простом примере настройки прозрачности строки состояния я покажу, как вызывать нативный код Java и Objective-C.
Андроид
Возможность использовать прозрачную строку состояния появилась в Андроид 4.4 КитКат .Чтобы строка состояния стала прозрачной, необходимо Активность нашего проекта, укажите флаг прозрачности для Окно (не путать с QQuickWindow , который используется для отображения QML).
Если кто-то не знает, как переопределить свою активность из QtActivity. Откройте вкладку «Проекты» → «Добавить сборку для Android» → «Сборка» → нажмите «Подробнее» в «Сборка Android APK» → «Создать шаблоны».
Таким образом, мы создали AndroidManifest — папку с ресурсами и файлами градиентов, которая будет находиться в папке android. Чтобы разместить наш Java-класс, давайте создадим папку src в папке Android. Давайте создадим файл Моя активность.
java .
Важно, чтобы путь к файлу совпадал с именем пакета, т.е.
использовался пакет с именем com.example.myPackage, должен быть способ android/src/com/example/myPackage/MyActivity.java
Теперь нам нужно установить имя действия в AndroidManifest.xml .package com.example.myPackage; import org.qtproject.qt5.android.bindings.QtActivity; import android.app.Activity; import android.os.Bundle; public class MyActivity extends QtActivity { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); } }
Ищем android:name="com.example.myPackage.MyActivity"
и изменить на android:name="org.qtproject.qt5.android.bindings.QtActivity"
С помощью этих простых манипуляций мы переопределили стандарт QtActivity. Функция, устанавливающая флаг прозрачности строки состояния и пример ее использования: @Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setTranparentStatusBar();
}
void function setTranparentStatusBar() {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
getWindow().
addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS); getWindow().
getDecorView().
setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN); getWindow().
setStatusBarColor(Color.TRANSPARENT); } else { getWindow().
setFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS, WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
}
}
Функция, возвращающая высоту строки состояния: public int statusBarHeight() {
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.KITKAT) {
return 0;
}
int result = 0;
int resourceId = getResources().
getIdentifier("status_bar_height", "dimen", "android"); if (resourceId > 0) { result = getResources().
getDimensionPixelSize(resourceId);
}
return result;
}
Чтобы вызвать метод класса Java из QML, вам нужно написать класс C++, который будет использовать JNI .
Для работы с JNI добавим его в наш *.
pro файл модуль Андроид: QT += androidextras.
Давайте создадим синглтон класс DeviceInfo. DeviceInfo.h: #pragma once
#include <QObject>
class DeviceInfo : public QObject
{
Q_OBJECT
Q_PROPERTY(int statusBarHeight READ statusBarHeight)
public:
DeviceInfo(QObject *parent = NULL);
static DeviceInfo &instance(QObject *parent = 0);
Q_INVOKABLE int statusBarHeight();
private:
static DeviceInfo _instance;
};
DeviceInfo.cpp: #include "DeviceInfo.h"
#if defined(Q_OS_ANDROID)
#include <QAndroidJniObject>
#include <QtAndroidExtras>
#include <QtAndroid>
#endif
DeviceInfo::DeviceInfo(QObject *parent)
: QObject(parent)
{}
DeviceInfo &DeviceInfo::instance(QObject *parent)
{
static DeviceInfo instance(parent);
return instance;
}
int DeviceInfo::statusBarHeight()
{
#if defined (Q_OS_ANDROID)
QAndroidJniObject activity = QtAndroid::androidActivity();
jint height = activity.callMethod<jint>("statusBarHeight");
return (int) height;
#endif
return 0;
}
Далее давайте определим наш класс в QML: view.rootContext()->setContextProperty("DeviceInfo", &DeviceInfo::instance());
Все готово, осталось только вызвать метод статусБарХайт в КМЛ: Rectangle {
width: parent.width
height: DeviceInfo.statusBarHeight()
}
Краткое описание на экране:
iOS
Возможность задавать разные стили статус-бара в iOS появилась в iOS 7.0 .Чтобы строка состояния в нашем приложении была прозрачной, нам нужно сделать 3 вещи:
- Изменить info.plist, а именно поменять ключ UIViewControllerBasedStatusBarAppearance :
<key>UIViewControllerBasedStatusBarAppearance</key>
<false/>
- Для отображения QQuickView или QQuickWindow используйте метод showFullScreen() вместо show().
- Установить в строку состояния стиль UIStatusBarStyleLightContent
Вы можете изменить стиль строки состояния, используя следующий метод в Objective-C: [[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleLightContent];
Функция, возвращающая высоту строки состояния: [UIApplication sharedApplication].
statusBarFrame.size.height
Чтобы код Objective-C работал в классе DeviceInfo, нам нужно изменить исходное разрешение с .
cpp на .
mm. Поэтому в файле .
pro сделаем следующее: HEADERS += \
Include/DeviceInfo.h
!ios {
SOURCES += \
Source/DeviceInfo.cpp
}
ios {
OBJECTIVE_SOURCES += \
Source/DeviceInfo.mm
}
DeviceInfo.mm: #include "DeviceInfo.h"
#import <UIKit/UIKit.h>
DeviceInfo::DeviceInfo(QObject *parent)
: QObject(parent)
{
[[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleLightContent];
}
DeviceInfo &DeviceInfo::instance(QObject *parent)
{
static DeviceInfo instance(parent);
return instance;
}
int DeviceInfo::statusBarHeight()
{
return [UIApplication sharedApplication].
statusBarFrame.size.height;
}
Краткое описание на экране:
Заключение
Я постарался максимально подробно осветить каждый шаг, чтобы на основе примеров из статьи вы могли легко дополнить свой мобильный проект нативным кодом.Пример исходного кода см.
GitHub .
Теги: #Qt #Android #java #iOS #objective-c #разработка мобильных устройств #Разработка мобильных приложений #Qt
Привет! Я уверен, что многие слышали, что Qt очень хорош для кроссплатформенной разработки мобильных приложений.
Однако для решения некоторых задач приходится иметь дело с нативным кодом (Java, Objective-C), например вызов камеры, галереи, вызов стороннего API. В этой статье на простом примере настройки прозрачности строки состояния я покажу, как вызывать нативный код Java и Objective-C.
Андроид
Возможность использовать прозрачную строку состояния появилась в Андроид 4.4 КитКат .Чтобы строка состояния стала прозрачной, необходимо Активность нашего проекта, укажите флаг прозрачности для Окно (не путать с QQuickWindow , который используется для отображения QML).
Если кто-то не знает, как переопределить свою активность из QtActivity. Откройте вкладку «Проекты» → «Добавить сборку для Android» → «Сборка» → нажмите «Подробнее» в «Сборка Android APK» → «Создать шаблоны».
Таким образом, мы создали AndroidManifest — папку с ресурсами и файлами градиентов, которая будет находиться в папке android. Чтобы разместить наш Java-класс, давайте создадим папку src в папке Android. Давайте создадим файл Моя активность.
java .
Важно, чтобы путь к файлу совпадал с именем пакета, т.е.
использовался пакет с именем com.example.myPackage, должен быть способ android/src/com/example/myPackage/MyActivity.java package com.example.myPackage;
import org.qtproject.qt5.android.bindings.QtActivity;
import android.app.Activity;
import android.os.Bundle;
public class MyActivity extends QtActivity
{
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
}
}
Теперь нам нужно установить имя действия в AndroidManifest.xml .
Ищем android:name="com.example.myPackage.MyActivity"
и изменить на android:name="org.qtproject.qt5.android.bindings.QtActivity"
С помощью этих простых манипуляций мы переопределили стандартную QtActivity. Функция, устанавливающая флаг прозрачности строки состояния и пример ее использования: @Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setTranparentStatusBar();
}
void function setTranparentStatusBar() {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
getWindow().
addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS); getWindow().
getDecorView().
setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN); getWindow().
setStatusBarColor(Color.TRANSPARENT); } else { getWindow().
setFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS, WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
}
}
Функция, возвращающая высоту строки состояния: public int statusBarHeight() {
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.KITKAT) {
return 0;
}
int result = 0;
int resourceId = getResources().
getIdentifier("status_bar_height", "dimen", "android"); if (resourceId > 0) { result = getResources().
getDimensionPixelSize(resourceId);
}
return result;
}
Чтобы вызвать метод класса Java из QML, вам нужно написать класс C++, который будет использовать JNI .
Для работы с JNI добавим его в наш *.
pro файл модуль Андроид: QT += androidextras.
Давайте создадим синглтон класс DeviceInfo. DeviceInfo.h: #pragma once
#include <QObject>
class DeviceInfo : public QObject
{
Q_OBJECT
Q_PROPERTY(int statusBarHeight READ statusBarHeight)
public:
DeviceInfo(QObject *parent = NULL);
static DeviceInfo &instance(QObject *parent = 0);
Q_INVOKABLE int statusBarHeight();
private:
static DeviceInfo _instance;
};
DeviceInfo.cpp: #include "DeviceInfo.h"
#if defined(Q_OS_ANDROID)
#include <QAndroidJniObject>
#include <QtAndroidExtras>
#include <QtAndroid>
#endif
DeviceInfo::DeviceInfo(QObject *parent)
: QObject(parent)
{}
DeviceInfo &DeviceInfo::instance(QObject *parent)
{
static DeviceInfo instance(parent);
return instance;
}
int DeviceInfo::statusBarHeight()
{
#if defined (Q_OS_ANDROID)
QAndroidJniObject activity = QtAndroid::androidActivity();
jint height = activity.callMethod<jint>("statusBarHeight");
return (int) height;
#endif
return 0;
}
Далее давайте определим наш класс в QML: view.rootContext()->setContextProperty("DeviceInfo", &DeviceInfo::instance());
Все готово, осталось только вызвать метод статусБарХайт в КМЛ: Rectangle {
width: parent.width
height: DeviceInfo.statusBarHeight()
}
Краткое описание на экране:
iOS
Возможность задавать разные стили статус-бара в iOS появилась в iOS 7.0 .Чтобы строка состояния в нашем приложении была прозрачной, нам нужно сделать 3 вещи:
- Изменить info.plist, а именно поменять ключ UIViewControllerBasedStatusBarAppearance :
<key>UIViewControllerBasedStatusBarAppearance</key>
<false/>
- Для отображения QQuickView или QQuickWindow используйте метод showFullScreen() вместо show().
- Установить в строку состояния стиль UIStatusBarStyleLightContent
Вы можете изменить стиль строки состояния, используя следующий метод в Objective-C: [[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleLightContent];
Функция, возвращающая высоту строки состояния: [UIApplication sharedApplication].
statusBarFrame.size.height
Чтобы код Objective-C работал в классе DeviceInfo, нам нужно изменить исходное разрешение с .
cpp на .
mm. Поэтому в файле .
pro сделаем следующее: HEADERS += \
Include/DeviceInfo.h
!ios {
SOURCES += \
Source/DeviceInfo.cpp
}
ios {
OBJECTIVE_SOURCES += \
Source/DeviceInfo.mm
}
DeviceInfo.mm: #include "DeviceInfo.h"
#import <UIKit/UIKit.h>
DeviceInfo::DeviceInfo(QObject *parent)
: QObject(parent)
{
[[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleLightContent];
}
DeviceInfo &DeviceInfo::instance(QObject *parent)
{
static DeviceInfo instance(parent);
return instance;
}
int DeviceInfo::statusBarHeight()
{
return [UIApplication sharedApplication].
statusBarFrame.size.height;
}
Краткое описание на экране:
Заключение
Я постарался максимально подробно осветить каждый шаг, чтобы на основе примеров из статьи вы могли легко дополнить свой мобильный проект нативным кодом.Пример исходного кода см.
GitHub .
Теги: #Qt #Android #java #iOS #objective-c #разработка мобильных устройств #Разработка мобильных приложений #Qt
-
Куда Идем?
19 Oct, 24 -
Обновление Альтернативы3D 7.7.0
19 Oct, 24 -
Новый Фильм Рэя Курцвейла
19 Oct, 24 -
Фиксированные Макеты Таблиц
19 Oct, 24 -
Iphone 3G – 11 Июля!
19 Oct, 24