Misc editor tweaks and polishes:
- Using a bucketized approach to select the editor scale in order to avoid too high values - Add default app dimensions: used on Android devices with free floating app windows to set the default app frame - Add ability to launch the Game window in an adjacent frame when in multi window mode
This commit is contained in:
parent
70eaaf2a01
commit
6f7ec7f723
6 changed files with 64 additions and 5 deletions
|
@ -1,6 +1,6 @@
|
|||
ext.versions = [
|
||||
androidGradlePlugin: '7.0.3',
|
||||
compileSdk : 30,
|
||||
compileSdk : 31,
|
||||
minSdk : 19, // Also update 'platform/android/java/lib/AndroidManifest.xml#minSdkVersion' & 'platform/android/export/export_plugin.cpp#DEFAULT_MIN_SDK_VERSION'
|
||||
targetSdk : 30, // Also update 'platform/android/java/lib/AndroidManifest.xml#targetSdkVersion' & 'platform/android/export/export_plugin.cpp#DEFAULT_TARGET_SDK_VERSION'
|
||||
buildTools : '30.0.3',
|
||||
|
|
|
@ -5,6 +5,8 @@ dependencies {
|
|||
implementation libraries.kotlinStdLib
|
||||
implementation libraries.androidxFragment
|
||||
implementation project(":lib")
|
||||
|
||||
implementation "androidx.window:window:1.0.0"
|
||||
}
|
||||
|
||||
android {
|
||||
|
|
|
@ -34,6 +34,9 @@
|
|||
android:theme="@android:style/Theme.Black.NoTitleBar.Fullscreen"
|
||||
android:process=":GodotProjectManager">
|
||||
|
||||
<layout android:defaultHeight="@dimen/editor_default_window_height"
|
||||
android:defaultWidth="@dimen/editor_default_window_width" />
|
||||
|
||||
<intent-filter>
|
||||
<action android:name="android.intent.action.MAIN" />
|
||||
<category android:name="android.intent.category.LAUNCHER" />
|
||||
|
@ -47,6 +50,8 @@
|
|||
android:launchMode="singleTask"
|
||||
android:screenOrientation="userLandscape"
|
||||
android:theme="@android:style/Theme.Black.NoTitleBar.Fullscreen">
|
||||
<layout android:defaultHeight="@dimen/editor_default_window_height"
|
||||
android:defaultWidth="@dimen/editor_default_window_width" />
|
||||
</activity>
|
||||
|
||||
<activity
|
||||
|
@ -57,6 +62,8 @@
|
|||
android:launchMode="singleTask"
|
||||
android:screenOrientation="userLandscape"
|
||||
android:theme="@android:style/Theme.Black.NoTitleBar.Fullscreen">
|
||||
<layout android:defaultHeight="@dimen/editor_default_window_height"
|
||||
android:defaultWidth="@dimen/editor_default_window_width" />
|
||||
</activity>
|
||||
|
||||
</application>
|
||||
|
|
|
@ -34,10 +34,13 @@ import org.godotengine.godot.FullScreenGodotApp;
|
|||
import org.godotengine.godot.utils.PermissionsUtil;
|
||||
|
||||
import android.content.Intent;
|
||||
import android.os.Build;
|
||||
import android.os.Bundle;
|
||||
import android.os.Debug;
|
||||
|
||||
import androidx.annotation.Nullable;
|
||||
import androidx.window.layout.WindowMetrics;
|
||||
import androidx.window.layout.WindowMetricsCalculator;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.Arrays;
|
||||
|
@ -91,23 +94,47 @@ public class GodotEditor extends FullScreenGodotApp {
|
|||
public void onNewGodotInstanceRequested(String[] args) {
|
||||
// Parse the arguments to figure out which activity to start.
|
||||
Class<?> targetClass = GodotGame.class;
|
||||
// Whether we should launch the new godot instance in an adjacent window
|
||||
// https://developer.android.com/reference/android/content/Intent#FLAG_ACTIVITY_LAUNCH_ADJACENT
|
||||
boolean launchAdjacent = Build.VERSION.SDK_INT >= Build.VERSION_CODES.N && (isInMultiWindowMode() || isLargeScreen());
|
||||
|
||||
for (String arg : args) {
|
||||
if (EDITOR_ARG.equals(arg)) {
|
||||
targetClass = GodotEditor.class;
|
||||
launchAdjacent = false;
|
||||
break;
|
||||
}
|
||||
|
||||
if (PROJECT_MANAGER_ARG.equals(arg)) {
|
||||
targetClass = GodotProjectManager.class;
|
||||
launchAdjacent = false;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
// Launch a new activity
|
||||
Intent newInstance = new Intent(this, targetClass).putExtra(COMMAND_LINE_PARAMS, args);
|
||||
Intent newInstance = new Intent(this, targetClass)
|
||||
.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
|
||||
.putExtra(COMMAND_LINE_PARAMS, args);
|
||||
if (launchAdjacent) {
|
||||
newInstance.addFlags(Intent.FLAG_ACTIVITY_LAUNCH_ADJACENT);
|
||||
}
|
||||
startActivity(newInstance);
|
||||
}
|
||||
|
||||
protected boolean isLargeScreen() {
|
||||
WindowMetrics metrics =
|
||||
WindowMetricsCalculator.getOrCreate().computeMaximumWindowMetrics(this);
|
||||
|
||||
// Get the screen's density scale
|
||||
float scale = getResources().getDisplayMetrics().density;
|
||||
|
||||
// Get the minimum window size
|
||||
float minSize = Math.min(metrics.getBounds().width(), metrics.getBounds().height());
|
||||
float minSizeDp = minSize / scale;
|
||||
return minSizeDp >= 840f; // Correspond to the EXPANDED window size class.
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setRequestedOrientation(int requestedOrientation) {
|
||||
if (!overrideOrientationRequest()) {
|
||||
|
|
|
@ -0,0 +1,5 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<resources>
|
||||
<dimen name="editor_default_window_height">600dp</dimen>
|
||||
<dimen name="editor_default_window_width">800dp</dimen>
|
||||
</resources>
|
|
@ -224,12 +224,30 @@ public class GodotIO {
|
|||
}
|
||||
|
||||
public int getScreenDPI() {
|
||||
DisplayMetrics metrics = activity.getResources().getDisplayMetrics();
|
||||
return (int)(metrics.density * 160f);
|
||||
return activity.getResources().getDisplayMetrics().densityDpi;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns bucketized density values.
|
||||
*/
|
||||
public float getScaledDensity() {
|
||||
return activity.getResources().getDisplayMetrics().scaledDensity;
|
||||
int densityDpi = activity.getResources().getDisplayMetrics().densityDpi;
|
||||
float selectedScaledDensity;
|
||||
if (densityDpi >= DisplayMetrics.DENSITY_XXXHIGH) {
|
||||
selectedScaledDensity = 4.0f;
|
||||
} else if (densityDpi >= DisplayMetrics.DENSITY_XXHIGH) {
|
||||
selectedScaledDensity = 3.0f;
|
||||
} else if (densityDpi >= DisplayMetrics.DENSITY_XHIGH) {
|
||||
selectedScaledDensity = 2.0f;
|
||||
} else if (densityDpi >= DisplayMetrics.DENSITY_HIGH) {
|
||||
selectedScaledDensity = 1.5f;
|
||||
} else if (densityDpi >= DisplayMetrics.DENSITY_MEDIUM) {
|
||||
selectedScaledDensity = 1.0f;
|
||||
} else {
|
||||
selectedScaledDensity = 0.75f;
|
||||
}
|
||||
Log.d(TAG, "Selected scaled density: " + selectedScaledDensity);
|
||||
return selectedScaledDensity;
|
||||
}
|
||||
|
||||
public double getScreenRefreshRate(double fallback) {
|
||||
|
|
Loading…
Reference in a new issue