Android: Add method to set root window color at runtime
This commit is contained in:
@ -626,6 +626,12 @@ bool DisplayServerAndroid::can_any_window_draw() const {
|
||||
return true;
|
||||
}
|
||||
|
||||
void DisplayServerAndroid::window_set_color(const Color &p_color) {
|
||||
GodotJavaWrapper *godot_java = OS_Android::get_singleton()->get_godot_java();
|
||||
ERR_FAIL_NULL(godot_java);
|
||||
godot_java->set_window_color(p_color);
|
||||
}
|
||||
|
||||
void DisplayServerAndroid::process_events() {
|
||||
Input::get_singleton()->flush_buffered_events();
|
||||
}
|
||||
|
||||
@ -220,6 +220,8 @@ public:
|
||||
virtual void window_set_vsync_mode(DisplayServer::VSyncMode p_vsync_mode, WindowID p_window = MAIN_WINDOW_ID) override;
|
||||
virtual DisplayServer::VSyncMode window_get_vsync_mode(WindowID p_vsync_mode) const override;
|
||||
|
||||
virtual void window_set_color(const Color &p_color) override;
|
||||
|
||||
virtual void process_events() override;
|
||||
|
||||
void process_accelerometer(const Vector3 &p_accelerometer);
|
||||
|
||||
@ -260,16 +260,7 @@ class Godot private constructor(val context: Context) {
|
||||
useImmersive.set(true)
|
||||
newArgs.add(commandLine[i])
|
||||
} else if (commandLine[i] == "--background_color") {
|
||||
val colorStr = commandLine[i + 1]
|
||||
try {
|
||||
backgroundColor = colorStr.toColorInt()
|
||||
Log.d(TAG, "background color = $backgroundColor")
|
||||
} catch (e: java.lang.IllegalArgumentException) {
|
||||
Log.d(TAG, "Failed to parse background color: $colorStr")
|
||||
}
|
||||
runOnHostThread {
|
||||
getActivity()?.window?.decorView?.setBackgroundColor(backgroundColor)
|
||||
}
|
||||
setWindowColor(commandLine[i + 1])
|
||||
} else if (commandLine[i] == "--use_apk_expansion") {
|
||||
useApkExpansion = true
|
||||
} else if (hasExtra && commandLine[i] == "--apk_expansion_md5") {
|
||||
@ -492,6 +483,21 @@ class Godot private constructor(val context: Context) {
|
||||
}
|
||||
}
|
||||
|
||||
fun setWindowColor(colorStr: String) {
|
||||
val color = try {
|
||||
colorStr.toColorInt()
|
||||
} catch (e: java.lang.IllegalArgumentException) {
|
||||
Log.w(TAG, "Failed to parse background color: $colorStr", e)
|
||||
return
|
||||
}
|
||||
val decorView = getActivity()?.window?.decorView ?: return
|
||||
runOnHostThread {
|
||||
decorView.setBackgroundColor(color)
|
||||
backgroundColor = color
|
||||
setSystemBarsAppearance()
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Used to complete initialization of the view used by the engine for rendering.
|
||||
*
|
||||
|
||||
@ -85,6 +85,7 @@ GodotJavaWrapper::GodotJavaWrapper(JNIEnv *p_env, jobject p_godot_instance) {
|
||||
_verify_apk = p_env->GetMethodID(godot_class, "nativeVerifyApk", "(Ljava/lang/String;)I");
|
||||
_enable_immersive_mode = p_env->GetMethodID(godot_class, "nativeEnableImmersiveMode", "(Z)V");
|
||||
_is_in_immersive_mode = p_env->GetMethodID(godot_class, "isInImmersiveMode", "()Z");
|
||||
_set_window_color = p_env->GetMethodID(godot_class, "setWindowColor", "(Ljava/lang/String;)V");
|
||||
_on_editor_workspace_selected = p_env->GetMethodID(godot_class, "nativeOnEditorWorkspaceSelected", "(Ljava/lang/String;)V");
|
||||
_get_activity = p_env->GetMethodID(godot_class, "getActivity", "()Landroid/app/Activity;");
|
||||
}
|
||||
@ -587,6 +588,16 @@ bool GodotJavaWrapper::is_in_immersive_mode() {
|
||||
}
|
||||
}
|
||||
|
||||
void GodotJavaWrapper::set_window_color(const Color &p_color) {
|
||||
if (_set_window_color) {
|
||||
JNIEnv *env = get_jni_env();
|
||||
ERR_FAIL_NULL(env);
|
||||
String color = "#" + p_color.to_html(false);
|
||||
jstring jStrColor = env->NewStringUTF(color.utf8().get_data());
|
||||
env->CallVoidMethod(godot_instance, _set_window_color, jStrColor);
|
||||
}
|
||||
}
|
||||
|
||||
void GodotJavaWrapper::on_editor_workspace_selected(const String &p_workspace) {
|
||||
if (_on_editor_workspace_selected) {
|
||||
JNIEnv *env = get_jni_env();
|
||||
|
||||
@ -81,6 +81,7 @@ private:
|
||||
jmethodID _verify_apk = nullptr;
|
||||
jmethodID _enable_immersive_mode = nullptr;
|
||||
jmethodID _is_in_immersive_mode = nullptr;
|
||||
jmethodID _set_window_color = nullptr;
|
||||
jmethodID _on_editor_workspace_selected = nullptr;
|
||||
jmethodID _get_activity = nullptr;
|
||||
|
||||
@ -137,5 +138,7 @@ public:
|
||||
void enable_immersive_mode(bool p_enabled);
|
||||
bool is_in_immersive_mode();
|
||||
|
||||
void set_window_color(const Color &p_color);
|
||||
|
||||
void on_editor_workspace_selected(const String &p_workspace);
|
||||
};
|
||||
|
||||
Reference in New Issue
Block a user