v3.0.0: added proper support for touches cancelled by system gestures
This commit is contained in:
@@ -133,11 +133,13 @@ public class InputHandler extends InputAdapter {
|
||||
|
||||
@Override
|
||||
public boolean touchCancelled(int screenX, int screenY, int pointer, int button) {
|
||||
//currently emulating functionality from libGDX 1.11.0, do we keep this?
|
||||
//in particular this is probably a more graceful way to handle things like system swipes on iOS
|
||||
//whereas previously they generated garbage inputs sometimes
|
||||
//which were then fixed in v2.2.2
|
||||
return touchUp(screenX, screenY, pointer, button);
|
||||
|
||||
if (button >= 3 && KeyBindings.isKeyBound( button + 1000 )) {
|
||||
KeyEvent.addKeyEvent( new KeyEvent( button + 1000, false ) );
|
||||
} else if (button < 3) {
|
||||
PointerEvent.addPointerEvent(new PointerEvent(screenX, screenY, pointer, PointerEvent.Type.CANCEL, button));
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
@@ -35,6 +35,7 @@ public class PointerEvent {
|
||||
public enum Type {
|
||||
DOWN,
|
||||
UP,
|
||||
CANCEL,
|
||||
HOVER
|
||||
}
|
||||
|
||||
@@ -82,6 +83,11 @@ public class PointerEvent {
|
||||
return this;
|
||||
}
|
||||
|
||||
public PointerEvent cancel() {
|
||||
if (type == Type.DOWN) type = Type.CANCEL;
|
||||
return this;
|
||||
}
|
||||
|
||||
public PointerEvent handle(){
|
||||
handled = true;
|
||||
return this;
|
||||
@@ -162,9 +168,12 @@ public class PointerEvent {
|
||||
pointerSignal.dispatch( null );
|
||||
} else if (p.type == Type.DOWN) {
|
||||
pointerSignal.dispatch( existing );
|
||||
} else {
|
||||
} else if (p.type == Type.UP){
|
||||
activePointers.remove(existing.id);
|
||||
pointerSignal.dispatch(existing.up());
|
||||
} else if (p.type == Type.CANCEL){
|
||||
activePointers.remove(existing.id);
|
||||
pointerSignal.dispatch(existing.cancel());
|
||||
}
|
||||
} else {
|
||||
if (p.type == Type.DOWN) {
|
||||
@@ -185,12 +194,4 @@ public class PointerEvent {
|
||||
}
|
||||
}
|
||||
|
||||
public static synchronized void clearPointerEvents(){
|
||||
pointerEvents.clear();
|
||||
for (PointerEvent p : activePointers.values()){
|
||||
p.current = p.start = new PointF(-1, -1);
|
||||
pointerSignal.dispatch(p.up());
|
||||
}
|
||||
activePointers.clear();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -33,7 +33,6 @@ import com.watabou.glwrap.Blending;
|
||||
import com.watabou.glwrap.Vertexbuffer;
|
||||
import com.watabou.input.ControllerHandler;
|
||||
import com.watabou.input.InputHandler;
|
||||
import com.watabou.input.PointerEvent;
|
||||
import com.watabou.noosa.audio.Music;
|
||||
import com.watabou.noosa.audio.Sample;
|
||||
import com.watabou.utils.Callback;
|
||||
@@ -146,10 +145,7 @@ public class Game implements ApplicationListener {
|
||||
}
|
||||
}
|
||||
|
||||
///justResumed is used for two purposes:
|
||||
//firstly, to clear pointer events when the game is resumed,
|
||||
// this helps with input errors caused by system gestures on iOS/Android
|
||||
//secondly, as a bit of a hack to improve start time metrics on Android,
|
||||
//justResumed is a bit of a hack to improve start time metrics on Android,
|
||||
// as texture refreshing leads to slow warm starts. TODO would be nice to fix this properly
|
||||
private boolean justResumed = true;
|
||||
|
||||
@@ -162,7 +158,6 @@ public class Game implements ApplicationListener {
|
||||
}
|
||||
|
||||
if (justResumed){
|
||||
PointerEvent.clearPointerEvents();
|
||||
justResumed = false;
|
||||
if (DeviceCompat.isAndroid()) return;
|
||||
}
|
||||
@@ -180,8 +175,6 @@ public class Game implements ApplicationListener {
|
||||
|
||||
@Override
|
||||
public void pause() {
|
||||
PointerEvent.clearPointerEvents();
|
||||
|
||||
if (scene != null) {
|
||||
scene.onPause();
|
||||
}
|
||||
|
||||
@@ -81,7 +81,16 @@ public class PointerArea extends Visual implements Signal.Listener<PointerEvent>
|
||||
curEvent = null;
|
||||
onClick( event );
|
||||
}
|
||||
|
||||
|
||||
//similar to up, but no click
|
||||
} else if (event.type == PointerEvent.Type.CANCEL) {
|
||||
|
||||
onPointerUp( event );
|
||||
|
||||
if (curEvent == event) {
|
||||
curEvent = null;
|
||||
}
|
||||
|
||||
} else if (event.type == PointerEvent.Type.HOVER) {
|
||||
if (event.handled && hovered){
|
||||
hovered = false;
|
||||
@@ -100,7 +109,8 @@ public class PointerArea extends Visual implements Signal.Listener<PointerEvent>
|
||||
if (event == null && curEvent != null) {
|
||||
onDrag(curEvent);
|
||||
|
||||
} else if (curEvent != null && event.type == PointerEvent.Type.UP) {
|
||||
} else if (curEvent != null &&
|
||||
(event.type == PointerEvent.Type.UP || event.type == PointerEvent.Type.CANCEL)) {
|
||||
onPointerUp( event );
|
||||
curEvent = null;
|
||||
|
||||
|
||||
@@ -45,7 +45,6 @@ import org.robovm.apple.foundation.NSString;
|
||||
import org.robovm.apple.glkit.GLKViewDrawableColorFormat;
|
||||
import org.robovm.apple.glkit.GLKViewDrawableDepthFormat;
|
||||
import org.robovm.apple.uikit.UIApplication;
|
||||
import org.robovm.apple.uikit.UIRectEdge;
|
||||
|
||||
import java.io.File;
|
||||
|
||||
@@ -102,12 +101,6 @@ public class IOSLauncher extends IOSApplication.Delegate {
|
||||
config.hideHomeIndicator = SPDSettings.fullscreen();
|
||||
config.overrideRingerSwitch = SPDSettings.ignoreSilentMode();
|
||||
|
||||
//game has to ignore input from system gestures itself, otherwise there is lag on
|
||||
//every button press on the corner of the screen. Currently this is accomplished via
|
||||
//clearing all pointer events on the first frame after the game is resumed.
|
||||
//TODO this may not be needed anymore with libgdx 1.12.1
|
||||
config.screenEdgesDeferringSystemGestures = UIRectEdge.All;
|
||||
|
||||
CGRect statusBarFrame = UIApplication.getSharedApplication().getStatusBarFrame();
|
||||
double statusBarHeight = Math.min(statusBarFrame.getWidth(), statusBarFrame.getHeight());
|
||||
|
||||
|
||||
Reference in New Issue
Block a user