Android: Add opt-in high-dpi support
Opt-in by setting android.app.auto_screen_scale_factor to true in AndroidManifest.xml. This will enable devicePixelRatio scaling in QtGui using a scale factor provided by Android DisplayMetrics. Note that the Android style is not currently supported: it already accounts for different display densities which results in incorrect visual sizes when enabling devicePixelRatio scaling. Implementation: Bring DisplayMetrics::density through to setDisplayMetrics in androidjnimain.cpp, similar to what is done for "scaledDensity". Override QPlatformScreen::pixelDensity(), which forwards the scale factor to QtGui. [The difference between "density" and "scaledDensity" is that the former is a physical display density factor which corresponds closely to devicePixelRatio in Qt, while the latter also includes the Android global font scale factor.] Scale the global font pixel size in qandroidplatformtheme.cpp to keep the visual font size constant. Based on an initial patch from Daiwei Li <daiweili@suitabletech.com> Task-number: QTBUG-46615 Change-Id: Ia51f99bf6dda485a57413949246c7b32cb47e8dd Reviewed-by: BogDan Vatra <bogdan@kdab.com>
This commit is contained in:
parent
45bb9c29e8
commit
b2d24dc347
@ -65,8 +65,8 @@ public class QtLayout extends ViewGroup
|
|||||||
{
|
{
|
||||||
DisplayMetrics metrics = new DisplayMetrics();
|
DisplayMetrics metrics = new DisplayMetrics();
|
||||||
((Activity) getContext()).getWindowManager().getDefaultDisplay().getMetrics(metrics);
|
((Activity) getContext()).getWindowManager().getDefaultDisplay().getMetrics(metrics);
|
||||||
QtNative.setApplicationDisplayMetrics(metrics.widthPixels,
|
QtNative.setApplicationDisplayMetrics(metrics.widthPixels, metrics.heightPixels, w, h,
|
||||||
metrics.heightPixels, w, h, metrics.xdpi, metrics.ydpi, metrics.scaledDensity);
|
metrics.xdpi, metrics.ydpi, metrics.scaledDensity, metrics.density);
|
||||||
if (m_startApplicationRunnable != null) {
|
if (m_startApplicationRunnable != null) {
|
||||||
m_startApplicationRunnable.run();
|
m_startApplicationRunnable.run();
|
||||||
m_startApplicationRunnable = null;
|
m_startApplicationRunnable = null;
|
||||||
|
@ -77,6 +77,7 @@ public class QtNative
|
|||||||
private static double m_displayMetricsXDpi = .0;
|
private static double m_displayMetricsXDpi = .0;
|
||||||
private static double m_displayMetricsYDpi = .0;
|
private static double m_displayMetricsYDpi = .0;
|
||||||
private static double m_displayMetricsScaledDensity = 1.0;
|
private static double m_displayMetricsScaledDensity = 1.0;
|
||||||
|
private static double m_displayMetricsDensity = 1.0;
|
||||||
private static int m_oldx, m_oldy;
|
private static int m_oldx, m_oldy;
|
||||||
private static final int m_moveThreshold = 0;
|
private static final int m_moveThreshold = 0;
|
||||||
private static ClipboardManager m_clipboardManager = null;
|
private static ClipboardManager m_clipboardManager = null;
|
||||||
@ -229,7 +230,8 @@ public class QtNative
|
|||||||
m_displayMetricsDesktopHeightPixels,
|
m_displayMetricsDesktopHeightPixels,
|
||||||
m_displayMetricsXDpi,
|
m_displayMetricsXDpi,
|
||||||
m_displayMetricsYDpi,
|
m_displayMetricsYDpi,
|
||||||
m_displayMetricsScaledDensity);
|
m_displayMetricsScaledDensity,
|
||||||
|
m_displayMetricsDensity);
|
||||||
if (params.length() > 0 && !params.startsWith("\t"))
|
if (params.length() > 0 && !params.startsWith("\t"))
|
||||||
params = "\t" + params;
|
params = "\t" + params;
|
||||||
startQtApplication(f.getAbsolutePath() + params, environment);
|
startQtApplication(f.getAbsolutePath() + params, environment);
|
||||||
@ -244,7 +246,8 @@ public class QtNative
|
|||||||
int desktopHeightPixels,
|
int desktopHeightPixels,
|
||||||
double XDpi,
|
double XDpi,
|
||||||
double YDpi,
|
double YDpi,
|
||||||
double scaledDensity)
|
double scaledDensity,
|
||||||
|
double density)
|
||||||
{
|
{
|
||||||
/* Fix buggy dpi report */
|
/* Fix buggy dpi report */
|
||||||
if (XDpi < android.util.DisplayMetrics.DENSITY_LOW)
|
if (XDpi < android.util.DisplayMetrics.DENSITY_LOW)
|
||||||
@ -260,7 +263,8 @@ public class QtNative
|
|||||||
desktopHeightPixels,
|
desktopHeightPixels,
|
||||||
XDpi,
|
XDpi,
|
||||||
YDpi,
|
YDpi,
|
||||||
scaledDensity);
|
scaledDensity,
|
||||||
|
density);
|
||||||
} else {
|
} else {
|
||||||
m_displayMetricsScreenWidthPixels = screenWidthPixels;
|
m_displayMetricsScreenWidthPixels = screenWidthPixels;
|
||||||
m_displayMetricsScreenHeightPixels = screenHeightPixels;
|
m_displayMetricsScreenHeightPixels = screenHeightPixels;
|
||||||
@ -269,6 +273,7 @@ public class QtNative
|
|||||||
m_displayMetricsXDpi = XDpi;
|
m_displayMetricsXDpi = XDpi;
|
||||||
m_displayMetricsYDpi = YDpi;
|
m_displayMetricsYDpi = YDpi;
|
||||||
m_displayMetricsScaledDensity = scaledDensity;
|
m_displayMetricsScaledDensity = scaledDensity;
|
||||||
|
m_displayMetricsDensity = density;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -621,7 +626,8 @@ public class QtNative
|
|||||||
int desktopHeightPixels,
|
int desktopHeightPixels,
|
||||||
double XDpi,
|
double XDpi,
|
||||||
double YDpi,
|
double YDpi,
|
||||||
double scaledDensity);
|
double scaledDensity,
|
||||||
|
double density);
|
||||||
public static native void handleOrientationChanged(int newRotation, int nativeOrientation);
|
public static native void handleOrientationChanged(int newRotation, int nativeOrientation);
|
||||||
// screen methods
|
// screen methods
|
||||||
|
|
||||||
|
@ -897,6 +897,12 @@ public class QtActivity extends Activity
|
|||||||
} else {
|
} else {
|
||||||
ENVIRONMENT_VARIABLES += "QT_BLOCK_EVENT_LOOPS_WHEN_SUSPENDED=1\t";
|
ENVIRONMENT_VARIABLES += "QT_BLOCK_EVENT_LOOPS_WHEN_SUSPENDED=1\t";
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (m_activityInfo.metaData.containsKey("android.app.auto_screen_scale_factor")
|
||||||
|
&& m_activityInfo.metaData.getBoolean("android.app.auto_screen_scale_factor")) {
|
||||||
|
ENVIRONMENT_VARIABLES += "QT_AUTO_SCREEN_SCALE_FACTOR=1\t";
|
||||||
|
}
|
||||||
|
|
||||||
startApp(true);
|
startApp(true);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -44,6 +44,10 @@
|
|||||||
signal is sent! -->
|
signal is sent! -->
|
||||||
<meta-data android:name="android.app.background_running" android:value="false"/>
|
<meta-data android:name="android.app.background_running" android:value="false"/>
|
||||||
<!-- Background running -->
|
<!-- Background running -->
|
||||||
|
|
||||||
|
<!-- auto screen scale factor -->
|
||||||
|
<meta-data android:name="android.app.auto_screen_scale_factor" android:value="false"/>
|
||||||
|
<!-- auto screen scale factor -->
|
||||||
</activity>
|
</activity>
|
||||||
</application>
|
</application>
|
||||||
<uses-sdk android:minSdkVersion="9" android:targetSdkVersion="14"/>
|
<uses-sdk android:minSdkVersion="9" android:targetSdkVersion="14"/>
|
||||||
|
@ -55,6 +55,7 @@
|
|||||||
#include <QtCore/private/qjnihelpers_p.h>
|
#include <QtCore/private/qjnihelpers_p.h>
|
||||||
#include <QtCore/private/qjni_p.h>
|
#include <QtCore/private/qjni_p.h>
|
||||||
#include <QtGui/private/qguiapplication_p.h>
|
#include <QtGui/private/qguiapplication_p.h>
|
||||||
|
#include <QtGui/private/qhighdpiscaling_p.h>
|
||||||
|
|
||||||
#include <qpa/qwindowsysteminterface.h>
|
#include <qpa/qwindowsysteminterface.h>
|
||||||
|
|
||||||
@ -109,6 +110,7 @@ static QAndroidPlatformIntegration *m_androidPlatformIntegration = nullptr;
|
|||||||
static int m_desktopWidthPixels = 0;
|
static int m_desktopWidthPixels = 0;
|
||||||
static int m_desktopHeightPixels = 0;
|
static int m_desktopHeightPixels = 0;
|
||||||
static double m_scaledDensity = 0;
|
static double m_scaledDensity = 0;
|
||||||
|
static double m_density = 1.0;
|
||||||
|
|
||||||
static volatile bool m_pauseApplication;
|
static volatile bool m_pauseApplication;
|
||||||
|
|
||||||
@ -157,6 +159,11 @@ namespace QtAndroid
|
|||||||
return m_scaledDensity;
|
return m_scaledDensity;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
double pixelDensity()
|
||||||
|
{
|
||||||
|
return m_density;
|
||||||
|
}
|
||||||
|
|
||||||
JavaVM *javaVM()
|
JavaVM *javaVM()
|
||||||
{
|
{
|
||||||
return m_javaVM;
|
return m_javaVM;
|
||||||
@ -547,7 +554,8 @@ static void setSurface(JNIEnv *env, jobject /*thiz*/, jint id, jobject jSurface,
|
|||||||
static void setDisplayMetrics(JNIEnv */*env*/, jclass /*clazz*/,
|
static void setDisplayMetrics(JNIEnv */*env*/, jclass /*clazz*/,
|
||||||
jint widthPixels, jint heightPixels,
|
jint widthPixels, jint heightPixels,
|
||||||
jint desktopWidthPixels, jint desktopHeightPixels,
|
jint desktopWidthPixels, jint desktopHeightPixels,
|
||||||
jdouble xdpi, jdouble ydpi, jdouble scaledDensity)
|
jdouble xdpi, jdouble ydpi,
|
||||||
|
jdouble scaledDensity, jdouble density)
|
||||||
{
|
{
|
||||||
// Android does not give us the correct screen size for immersive mode, but
|
// Android does not give us the correct screen size for immersive mode, but
|
||||||
// the surface does have the right size
|
// the surface does have the right size
|
||||||
@ -558,6 +566,7 @@ static void setDisplayMetrics(JNIEnv */*env*/, jclass /*clazz*/,
|
|||||||
m_desktopWidthPixels = desktopWidthPixels;
|
m_desktopWidthPixels = desktopWidthPixels;
|
||||||
m_desktopHeightPixels = desktopHeightPixels;
|
m_desktopHeightPixels = desktopHeightPixels;
|
||||||
m_scaledDensity = scaledDensity;
|
m_scaledDensity = scaledDensity;
|
||||||
|
m_density = density;
|
||||||
|
|
||||||
if (!m_androidPlatformIntegration) {
|
if (!m_androidPlatformIntegration) {
|
||||||
QAndroidPlatformIntegration::setDefaultDisplayMetrics(desktopWidthPixels,
|
QAndroidPlatformIntegration::setDefaultDisplayMetrics(desktopWidthPixels,
|
||||||
@ -683,7 +692,7 @@ static JNINativeMethod methods[] = {
|
|||||||
{"startQtApplication", "(Ljava/lang/String;Ljava/lang/String;)V", (void *)startQtApplication},
|
{"startQtApplication", "(Ljava/lang/String;Ljava/lang/String;)V", (void *)startQtApplication},
|
||||||
{"quitQtAndroidPlugin", "()V", (void *)quitQtAndroidPlugin},
|
{"quitQtAndroidPlugin", "()V", (void *)quitQtAndroidPlugin},
|
||||||
{"terminateQt", "()V", (void *)terminateQt},
|
{"terminateQt", "()V", (void *)terminateQt},
|
||||||
{"setDisplayMetrics", "(IIIIDDD)V", (void *)setDisplayMetrics},
|
{"setDisplayMetrics", "(IIIIDDDD)V", (void *)setDisplayMetrics},
|
||||||
{"setSurface", "(ILjava/lang/Object;II)V", (void *)setSurface},
|
{"setSurface", "(ILjava/lang/Object;II)V", (void *)setSurface},
|
||||||
{"updateWindow", "()V", (void *)updateWindow},
|
{"updateWindow", "()V", (void *)updateWindow},
|
||||||
{"updateApplicationState", "(I)V", (void *)updateApplicationState},
|
{"updateApplicationState", "(I)V", (void *)updateApplicationState},
|
||||||
|
@ -71,6 +71,7 @@ namespace QtAndroid
|
|||||||
int desktopWidthPixels();
|
int desktopWidthPixels();
|
||||||
int desktopHeightPixels();
|
int desktopHeightPixels();
|
||||||
double scaledDensity();
|
double scaledDensity();
|
||||||
|
double pixelDensity();
|
||||||
JavaVM *javaVM();
|
JavaVM *javaVM();
|
||||||
AAssetManager *assetManager();
|
AAssetManager *assetManager();
|
||||||
jclass applicationClass();
|
jclass applicationClass();
|
||||||
|
@ -382,6 +382,11 @@ QDpi QAndroidPlatformScreen::logicalDpi() const
|
|||||||
return QDpi(lDpi, lDpi);
|
return QDpi(lDpi, lDpi);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
qreal QAndroidPlatformScreen::pixelDensity() const
|
||||||
|
{
|
||||||
|
return QtAndroid::pixelDensity();
|
||||||
|
}
|
||||||
|
|
||||||
Qt::ScreenOrientation QAndroidPlatformScreen::orientation() const
|
Qt::ScreenOrientation QAndroidPlatformScreen::orientation() const
|
||||||
{
|
{
|
||||||
return QAndroidPlatformIntegration::m_orientation;
|
return QAndroidPlatformIntegration::m_orientation;
|
||||||
|
@ -96,6 +96,7 @@ protected:
|
|||||||
|
|
||||||
private:
|
private:
|
||||||
QDpi logicalDpi() const;
|
QDpi logicalDpi() const;
|
||||||
|
qreal pixelDensity() const;
|
||||||
Qt::ScreenOrientation orientation() const;
|
Qt::ScreenOrientation orientation() const;
|
||||||
Qt::ScreenOrientation nativeOrientation() const;
|
Qt::ScreenOrientation nativeOrientation() const;
|
||||||
void surfaceChanged(JNIEnv *env, jobject surface, int w, int h);
|
void surfaceChanged(JNIEnv *env, jobject surface, int w, int h);
|
||||||
|
@ -31,6 +31,7 @@
|
|||||||
**
|
**
|
||||||
****************************************************************************/
|
****************************************************************************/
|
||||||
|
|
||||||
|
#include "androidjnimain.h"
|
||||||
#include "androidjnimenu.h"
|
#include "androidjnimenu.h"
|
||||||
#include "qandroidplatformtheme.h"
|
#include "qandroidplatformtheme.h"
|
||||||
#include "qandroidplatformmenubar.h"
|
#include "qandroidplatformmenubar.h"
|
||||||
@ -216,6 +217,7 @@ QJsonObject AndroidStyle::loadStyleData()
|
|||||||
|
|
||||||
static std::shared_ptr<AndroidStyle> loadAndroidStyle(QPalette *defaultPalette)
|
static std::shared_ptr<AndroidStyle> loadAndroidStyle(QPalette *defaultPalette)
|
||||||
{
|
{
|
||||||
|
double pixelDensity = qEnvironmentVariableIsSet("QT_AUTO_SCREEN_SCALE_FACTOR") ? QtAndroid::pixelDensity() : 1.0;
|
||||||
std::shared_ptr<AndroidStyle> style(new AndroidStyle);
|
std::shared_ptr<AndroidStyle> style(new AndroidStyle);
|
||||||
style->m_styleData = AndroidStyle::loadStyleData();
|
style->m_styleData = AndroidStyle::loadStyleData();
|
||||||
if (style->m_styleData.isEmpty())
|
if (style->m_styleData.isEmpty())
|
||||||
@ -245,7 +247,7 @@ static std::shared_ptr<AndroidStyle> loadAndroidStyle(QPalette *defaultPalette)
|
|||||||
// Font size (in pixels)
|
// Font size (in pixels)
|
||||||
attributeIterator = item.find(QLatin1String("TextAppearance_textSize"));
|
attributeIterator = item.find(QLatin1String("TextAppearance_textSize"));
|
||||||
if (attributeIterator != item.constEnd())
|
if (attributeIterator != item.constEnd())
|
||||||
font.setPixelSize(int(attributeIterator.value().toDouble()));
|
font.setPixelSize(int(attributeIterator.value().toDouble() / pixelDensity));
|
||||||
|
|
||||||
// Font style
|
// Font style
|
||||||
attributeIterator = item.find(QLatin1String("TextAppearance_textStyle"));
|
attributeIterator = item.find(QLatin1String("TextAppearance_textStyle"));
|
||||||
|
Loading…
x
Reference in New Issue
Block a user