You've already forked godot
mirror of
https://github.com/godotengine/godot.git
synced 2025-11-05 12:10:55 +00:00
Android: Mouse Implementation
Implement mouse Move touch to inputManager Change to use android/input.h
This commit is contained in:
@@ -70,6 +70,7 @@ import android.os.VibrationEffect;
|
||||
import android.os.Vibrator;
|
||||
import android.provider.Settings.Secure;
|
||||
import android.view.Display;
|
||||
import android.view.InputDevice;
|
||||
import android.view.KeyEvent;
|
||||
import android.view.LayoutInflater;
|
||||
import android.view.MotionEvent;
|
||||
@@ -854,63 +855,6 @@ public class Godot extends Fragment implements SensorEventListener, IDownloaderC
|
||||
}
|
||||
}
|
||||
|
||||
public boolean gotTouchEvent(final MotionEvent event) {
|
||||
final int evcount = event.getPointerCount();
|
||||
if (evcount == 0)
|
||||
return true;
|
||||
|
||||
if (mRenderView != null) {
|
||||
final int[] arr = new int[event.getPointerCount() * 3];
|
||||
|
||||
for (int i = 0; i < event.getPointerCount(); i++) {
|
||||
arr[i * 3 + 0] = (int)event.getPointerId(i);
|
||||
arr[i * 3 + 1] = (int)event.getX(i);
|
||||
arr[i * 3 + 2] = (int)event.getY(i);
|
||||
}
|
||||
final int pointer_idx = event.getPointerId(event.getActionIndex());
|
||||
|
||||
//System.out.printf("gaction: %d\n",event.getAction());
|
||||
final int action = event.getAction() & MotionEvent.ACTION_MASK;
|
||||
mRenderView.queueOnRenderThread(new Runnable() {
|
||||
@Override
|
||||
public void run() {
|
||||
switch (action) {
|
||||
case MotionEvent.ACTION_DOWN: {
|
||||
GodotLib.touch(0, 0, evcount, arr);
|
||||
//System.out.printf("action down at: %f,%f\n", event.getX(),event.getY());
|
||||
} break;
|
||||
case MotionEvent.ACTION_MOVE: {
|
||||
GodotLib.touch(1, 0, evcount, arr);
|
||||
/*
|
||||
for(int i=0;i<event.getPointerCount();i++) {
|
||||
System.out.printf("%d - moved to: %f,%f\n",i, event.getX(i),event.getY(i));
|
||||
}
|
||||
*/
|
||||
} break;
|
||||
case MotionEvent.ACTION_POINTER_UP: {
|
||||
GodotLib.touch(4, pointer_idx, evcount, arr);
|
||||
//System.out.printf("%d - s.up at: %f,%f\n",pointer_idx, event.getX(pointer_idx),event.getY(pointer_idx));
|
||||
} break;
|
||||
case MotionEvent.ACTION_POINTER_DOWN: {
|
||||
GodotLib.touch(3, pointer_idx, evcount, arr);
|
||||
//System.out.printf("%d - s.down at: %f,%f\n",pointer_idx, event.getX(pointer_idx),event.getY(pointer_idx));
|
||||
} break;
|
||||
case MotionEvent.ACTION_CANCEL:
|
||||
case MotionEvent.ACTION_UP: {
|
||||
GodotLib.touch(2, 0, evcount, arr);
|
||||
/*
|
||||
for(int i=0;i<event.getPointerCount();i++) {
|
||||
System.out.printf("%d - up! %f,%f\n",i, event.getX(i),event.getY(i));
|
||||
}
|
||||
*/
|
||||
} break;
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
public boolean onKeyMultiple(final int inKeyCode, int repeatCount, KeyEvent event) {
|
||||
String s = event.getCharacters();
|
||||
if (s == null || s.length() == 0)
|
||||
|
||||
@@ -29,7 +29,6 @@
|
||||
/*************************************************************************/
|
||||
|
||||
package org.godotengine.godot;
|
||||
|
||||
import org.godotengine.godot.input.GodotGestureHandler;
|
||||
import org.godotengine.godot.input.GodotInputHandler;
|
||||
import org.godotengine.godot.utils.GLUtils;
|
||||
@@ -127,7 +126,7 @@ public class GodotGLRenderView extends GLSurfaceView implements GodotRenderView
|
||||
public boolean onTouchEvent(MotionEvent event) {
|
||||
super.onTouchEvent(event);
|
||||
this.detector.onTouchEvent(event);
|
||||
return godot.gotTouchEvent(event);
|
||||
return inputHandler.onTouchEvent(event);
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
@@ -94,17 +94,19 @@ public class GodotLib {
|
||||
/**
|
||||
* Forward touch events from the main thread to the GL thread.
|
||||
*/
|
||||
public static native void touch(int what, int pointer, int howmany, int[] arr);
|
||||
public static native void touch(int inputDevice, int event, int pointer, int pointerCount, float[] positions);
|
||||
public static native void touch(int inputDevice, int event, int pointer, int pointerCount, float[] positions, int buttonsMask);
|
||||
public static native void touch(int inputDevice, int event, int pointer, int pointerCount, float[] positions, int buttonsMask, float verticalFactor, float horizontalFactor);
|
||||
|
||||
/**
|
||||
* Forward hover events from the main thread to the GL thread.
|
||||
*/
|
||||
public static native void hover(int type, int x, int y);
|
||||
public static native void hover(int type, float x, float y);
|
||||
|
||||
/**
|
||||
* Forward double_tap events from the main thread to the GL thread.
|
||||
*/
|
||||
public static native void doubletap(int x, int y);
|
||||
public static native void doubleTap(int buttonMask, int x, int y);
|
||||
|
||||
/**
|
||||
* Forward scroll events from the main thread to the GL thread.
|
||||
|
||||
@@ -38,6 +38,7 @@ import org.godotengine.godot.vulkan.VkSurfaceView;
|
||||
import android.annotation.SuppressLint;
|
||||
import android.content.Context;
|
||||
import android.view.GestureDetector;
|
||||
import android.view.InputDevice;
|
||||
import android.view.KeyEvent;
|
||||
import android.view.MotionEvent;
|
||||
import android.view.SurfaceView;
|
||||
@@ -100,22 +101,22 @@ public class GodotVulkanRenderView extends VkSurfaceView implements GodotRenderV
|
||||
public boolean onTouchEvent(MotionEvent event) {
|
||||
super.onTouchEvent(event);
|
||||
mGestureDetector.onTouchEvent(event);
|
||||
return godot.gotTouchEvent(event);
|
||||
return mInputHandler.onTouchEvent(event);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean onKeyUp(final int keyCode, KeyEvent event) {
|
||||
return mInputHandler.onKeyUp(keyCode, event) || super.onKeyUp(keyCode, event);
|
||||
return mInputHandler.onKeyUp(keyCode, event);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean onKeyDown(final int keyCode, KeyEvent event) {
|
||||
return mInputHandler.onKeyDown(keyCode, event) || super.onKeyDown(keyCode, event);
|
||||
return mInputHandler.onKeyDown(keyCode, event);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean onGenericMotionEvent(MotionEvent event) {
|
||||
return mInputHandler.onGenericMotionEvent(event) || super.onGenericMotionEvent(event);
|
||||
return mInputHandler.onGenericMotionEvent(event);
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
@@ -33,7 +33,6 @@ package org.godotengine.godot.input;
|
||||
import org.godotengine.godot.GodotLib;
|
||||
import org.godotengine.godot.GodotRenderView;
|
||||
|
||||
import android.util.Log;
|
||||
import android.view.GestureDetector;
|
||||
import android.view.MotionEvent;
|
||||
|
||||
@@ -75,10 +74,11 @@ public class GodotGestureHandler extends GestureDetector.SimpleOnGestureListener
|
||||
//Log.i("GodotGesture", "onDoubleTap");
|
||||
final int x = Math.round(event.getX());
|
||||
final int y = Math.round(event.getY());
|
||||
final int buttonMask = event.getButtonState();
|
||||
queueEvent(new Runnable() {
|
||||
@Override
|
||||
public void run() {
|
||||
GodotLib.doubletap(x, y);
|
||||
GodotLib.doubleTap(buttonMask, x, y);
|
||||
}
|
||||
});
|
||||
return true;
|
||||
|
||||
@@ -36,6 +36,7 @@ import org.godotengine.godot.GodotLib;
|
||||
import org.godotengine.godot.GodotRenderView;
|
||||
import org.godotengine.godot.input.InputManagerCompat.InputDeviceListener;
|
||||
|
||||
import android.os.Build;
|
||||
import android.util.Log;
|
||||
import android.view.InputDevice;
|
||||
import android.view.InputDevice.MotionRange;
|
||||
@@ -156,6 +157,53 @@ public class GodotInputHandler implements InputDeviceListener {
|
||||
return true;
|
||||
}
|
||||
|
||||
public boolean onTouchEvent(final MotionEvent event) {
|
||||
// Mouse drag (mouse pressed and move) doesn't fire onGenericMotionEvent so this is needed
|
||||
if (event.isFromSource(InputDevice.SOURCE_MOUSE)) {
|
||||
if (event.getAction() != MotionEvent.ACTION_MOVE) {
|
||||
// we return true because every time a mouse event is fired, the event is already handled
|
||||
// in onGenericMotionEvent, so by touch event we can say that the event is also handled
|
||||
return true;
|
||||
}
|
||||
return handleMouseEvent(event);
|
||||
}
|
||||
|
||||
final int evcount = event.getPointerCount();
|
||||
if (evcount == 0)
|
||||
return true;
|
||||
|
||||
if (mRenderView != null) {
|
||||
final float[] arr = new float[event.getPointerCount() * 3]; // pointerId1, x1, y1, pointerId2, etc...
|
||||
|
||||
for (int i = 0; i < event.getPointerCount(); i++) {
|
||||
arr[i * 3 + 0] = event.getPointerId(i);
|
||||
arr[i * 3 + 1] = event.getX(i);
|
||||
arr[i * 3 + 2] = event.getY(i);
|
||||
}
|
||||
final int action = event.getActionMasked();
|
||||
|
||||
mRenderView.queueOnRenderThread(new Runnable() {
|
||||
@Override
|
||||
public void run() {
|
||||
switch (action) {
|
||||
case MotionEvent.ACTION_DOWN:
|
||||
case MotionEvent.ACTION_CANCEL:
|
||||
case MotionEvent.ACTION_UP:
|
||||
case MotionEvent.ACTION_MOVE: {
|
||||
GodotLib.touch(event.getSource(), action, 0, evcount, arr);
|
||||
} break;
|
||||
case MotionEvent.ACTION_POINTER_UP:
|
||||
case MotionEvent.ACTION_POINTER_DOWN: {
|
||||
int pointer_idx = event.getPointerId(event.getActionIndex());
|
||||
GodotLib.touch(event.getSource(), action, pointer_idx, evcount, arr);
|
||||
} break;
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
public boolean onGenericMotionEvent(MotionEvent event) {
|
||||
if ((event.getSource() & InputDevice.SOURCE_JOYSTICK) == InputDevice.SOURCE_JOYSTICK && event.getAction() == MotionEvent.ACTION_MOVE) {
|
||||
final int device_id = findJoystickDevice(event.getDeviceId());
|
||||
@@ -189,8 +237,8 @@ public class GodotInputHandler implements InputDeviceListener {
|
||||
return true;
|
||||
}
|
||||
} else if ((event.getSource() & InputDevice.SOURCE_STYLUS) == InputDevice.SOURCE_STYLUS) {
|
||||
final int x = Math.round(event.getX());
|
||||
final int y = Math.round(event.getY());
|
||||
final float x = event.getX();
|
||||
final float y = event.getY();
|
||||
final int type = event.getAction();
|
||||
queueEvent(new Runnable() {
|
||||
@Override
|
||||
@@ -199,6 +247,10 @@ public class GodotInputHandler implements InputDeviceListener {
|
||||
}
|
||||
});
|
||||
return true;
|
||||
} else if ((event.getSource() & InputDevice.SOURCE_MOUSE) == InputDevice.SOURCE_MOUSE) {
|
||||
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
|
||||
return handleMouseEvent(event);
|
||||
}
|
||||
}
|
||||
|
||||
return false;
|
||||
@@ -366,4 +418,53 @@ public class GodotInputHandler implements InputDeviceListener {
|
||||
|
||||
return -1;
|
||||
}
|
||||
|
||||
private boolean handleMouseEvent(final MotionEvent event) {
|
||||
switch (event.getActionMasked()) {
|
||||
case MotionEvent.ACTION_HOVER_ENTER:
|
||||
case MotionEvent.ACTION_HOVER_MOVE:
|
||||
case MotionEvent.ACTION_HOVER_EXIT: {
|
||||
final float x = event.getX();
|
||||
final float y = event.getY();
|
||||
final int type = event.getAction();
|
||||
queueEvent(new Runnable() {
|
||||
@Override
|
||||
public void run() {
|
||||
GodotLib.hover(type, x, y);
|
||||
}
|
||||
});
|
||||
return true;
|
||||
}
|
||||
case MotionEvent.ACTION_BUTTON_PRESS:
|
||||
case MotionEvent.ACTION_BUTTON_RELEASE:
|
||||
case MotionEvent.ACTION_MOVE: {
|
||||
final float x = event.getX();
|
||||
final float y = event.getY();
|
||||
final int buttonsMask = event.getButtonState();
|
||||
final int action = event.getAction();
|
||||
queueEvent(new Runnable() {
|
||||
@Override
|
||||
public void run() {
|
||||
GodotLib.touch(event.getSource(), action, 0, 1, new float[] { 0, x, y }, buttonsMask);
|
||||
}
|
||||
});
|
||||
return true;
|
||||
}
|
||||
case MotionEvent.ACTION_SCROLL: {
|
||||
final float x = event.getX();
|
||||
final float y = event.getY();
|
||||
final int buttonsMask = event.getButtonState();
|
||||
final int action = event.getAction();
|
||||
final float verticalFactor = event.getAxisValue(MotionEvent.AXIS_VSCROLL);
|
||||
final float horizontalFactor = event.getAxisValue(MotionEvent.AXIS_HSCROLL);
|
||||
queueEvent(new Runnable() {
|
||||
@Override
|
||||
public void run() {
|
||||
GodotLib.touch(event.getSource(), action, 0, 1, new float[] { 0, x, y }, buttonsMask, verticalFactor, horizontalFactor);
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user