Merge pull request #74398 from necrashter/android-vk-height
Use the new API for virtual keyboard height detection on Android, bugfix for old API
This commit is contained in:
commit
19a51467af
|
@ -74,10 +74,14 @@ import android.util.Log;
|
||||||
import android.view.Display;
|
import android.view.Display;
|
||||||
import android.view.LayoutInflater;
|
import android.view.LayoutInflater;
|
||||||
import android.view.Surface;
|
import android.view.Surface;
|
||||||
|
import android.view.SurfaceView;
|
||||||
import android.view.View;
|
import android.view.View;
|
||||||
import android.view.ViewGroup;
|
import android.view.ViewGroup;
|
||||||
import android.view.ViewGroup.LayoutParams;
|
import android.view.ViewGroup.LayoutParams;
|
||||||
|
import android.view.ViewTreeObserver;
|
||||||
import android.view.Window;
|
import android.view.Window;
|
||||||
|
import android.view.WindowInsets;
|
||||||
|
import android.view.WindowInsetsAnimation;
|
||||||
import android.view.WindowManager;
|
import android.view.WindowManager;
|
||||||
import android.widget.Button;
|
import android.widget.Button;
|
||||||
import android.widget.FrameLayout;
|
import android.widget.FrameLayout;
|
||||||
|
@ -291,14 +295,64 @@ public class Godot extends Fragment implements SensorEventListener, IDownloaderC
|
||||||
editText.setView(mRenderView);
|
editText.setView(mRenderView);
|
||||||
io.setEdit(editText);
|
io.setEdit(editText);
|
||||||
|
|
||||||
view.getViewTreeObserver().addOnGlobalLayoutListener(() -> {
|
// Listeners for keyboard height.
|
||||||
Point fullSize = new Point();
|
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) {
|
||||||
activity.getWindowManager().getDefaultDisplay().getSize(fullSize);
|
// Report the height of virtual keyboard as it changes during the animation.
|
||||||
Rect gameSize = new Rect();
|
final View decorView = activity.getWindow().getDecorView();
|
||||||
mRenderView.getView().getWindowVisibleDisplayFrame(gameSize);
|
decorView.setWindowInsetsAnimationCallback(new WindowInsetsAnimation.Callback(WindowInsetsAnimation.Callback.DISPATCH_MODE_STOP) {
|
||||||
final int keyboardHeight = fullSize.y - gameSize.bottom;
|
int startBottom, endBottom;
|
||||||
GodotLib.setVirtualKeyboardHeight(keyboardHeight);
|
@Override
|
||||||
});
|
public void onPrepare(@NonNull WindowInsetsAnimation animation) {
|
||||||
|
startBottom = decorView.getRootWindowInsets().getInsets(WindowInsets.Type.ime()).bottom;
|
||||||
|
}
|
||||||
|
|
||||||
|
@NonNull
|
||||||
|
@Override
|
||||||
|
public WindowInsetsAnimation.Bounds onStart(@NonNull WindowInsetsAnimation animation, @NonNull WindowInsetsAnimation.Bounds bounds) {
|
||||||
|
endBottom = decorView.getRootWindowInsets().getInsets(WindowInsets.Type.ime()).bottom;
|
||||||
|
return bounds;
|
||||||
|
}
|
||||||
|
|
||||||
|
@NonNull
|
||||||
|
@Override
|
||||||
|
public WindowInsets onProgress(@NonNull WindowInsets windowInsets, @NonNull List<WindowInsetsAnimation> list) {
|
||||||
|
// Find the IME animation.
|
||||||
|
WindowInsetsAnimation imeAnimation = null;
|
||||||
|
for (WindowInsetsAnimation animation : list) {
|
||||||
|
if ((animation.getTypeMask() & WindowInsets.Type.ime()) != 0) {
|
||||||
|
imeAnimation = animation;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// Update keyboard height based on IME animation.
|
||||||
|
if (imeAnimation != null) {
|
||||||
|
float interpolatedFraction = imeAnimation.getInterpolatedFraction();
|
||||||
|
// Linear interpolation between start and end values.
|
||||||
|
float keyboardHeight = startBottom * (1.0f - interpolatedFraction) + endBottom * interpolatedFraction;
|
||||||
|
GodotLib.setVirtualKeyboardHeight((int)keyboardHeight);
|
||||||
|
}
|
||||||
|
return windowInsets;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onEnd(@NonNull WindowInsetsAnimation animation) {
|
||||||
|
}
|
||||||
|
});
|
||||||
|
} else {
|
||||||
|
// Infer the virtual keyboard height using visible area.
|
||||||
|
view.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
|
||||||
|
// Don't allocate a new Rect every time the callback is called.
|
||||||
|
final Rect visibleSize = new Rect();
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onGlobalLayout() {
|
||||||
|
final SurfaceView view = mRenderView.getView();
|
||||||
|
view.getWindowVisibleDisplayFrame(visibleSize);
|
||||||
|
final int keyboardHeight = view.getHeight() - visibleSize.bottom;
|
||||||
|
GodotLib.setVirtualKeyboardHeight(keyboardHeight);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
mRenderView.queueOnRenderThread(() -> {
|
mRenderView.queueOnRenderThread(() -> {
|
||||||
for (GodotPlugin plugin : pluginRegistry.getAllPlugins()) {
|
for (GodotPlugin plugin : pluginRegistry.getAllPlugins()) {
|
||||||
|
|
Loading…
Reference in New Issue