/*******************************************************************************
* Copyright 2011 See AUTHORS file.
*
* Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on
* an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the
* specific language governing permissions and limitations under the License.
******************************************************************************/
package com.badlogic.gdx.scenes.scene2d.utils;
import com.badlogic.gdx.Input.Buttons;
import com.badlogic.gdx.scenes.scene2d.InputEvent;
import com.badlogic.gdx.scenes.scene2d.InputListener;
/**
* Detects mouse or finger touch drags on an actor. A touch must go down over the actor and a drag won't start until it
* is moved outside the {@link #setTapSquareSize(float) tap square}. Any touch (not just the first) will trigger this
* listener. While pressed, other touch downs are ignored.
*
* @author Nathan Sweet
*/
public class DragListener extends InputListener {
private float tapSquareSize = 14, touchDownX = -1, touchDownY = -1;
private int pressedPointer = -1;
private int button;
private boolean dragging;
private float deltaX, deltaY;
public boolean touchDown(InputEvent event, float x, float y, int pointer, int button) {
if (pressedPointer != -1)
return false;
if (pointer == 0 && this.button != -1 && button != this.button)
return false;
pressedPointer = pointer;
touchDownX = x;
touchDownY = y;
return true;
}
public void touchDragged(InputEvent event, float x, float y, int pointer) {
if (pointer != pressedPointer)
return;
if (!dragging && (Math.abs(touchDownX - x) > tapSquareSize || Math.abs(touchDownY - y) > tapSquareSize)) {
dragging = true;
dragStart(event, x, y, pointer);
deltaX = x;
deltaY = y;
}
if (dragging) {
deltaX -= x;
deltaY -= y;
drag(event, x, y, pointer);
deltaX = x;
deltaY = y;
}
}
public void touchUp(InputEvent event, float x, float y, int pointer, int button) {
if (pointer == pressedPointer) {
if (dragging)
dragStop(event, x, y, pointer);
dragging = false;
pressedPointer = -1;
}
}
public void dragStart(InputEvent event, float x, float y, int pointer) {
}
public void drag(InputEvent event, float x, float y, int pointer) {
}
public void dragStop(InputEvent event, float x, float y, int pointer) {
}
/** Returns true if a touch has been dragged outside the tap square. */
public boolean isDragging() {
return dragging;
}
public void setTapSquareSize(float halfTapSquareSize) {
tapSquareSize = halfTapSquareSize;
}
public float getTapSquareSize() {
return tapSquareSize;
}
public float getTouchDownX() {
return touchDownX;
}
public float getTouchDownY() {
return touchDownY;
}
/** Returns the amount on the x axis that the touch has been dragged since the last drag event. */
public float getDeltaX() {
return deltaX;
}
/** Returns the amount on the y axis that the touch has been dragged since the last drag event. */
public float getDeltaY() {
return deltaY;
}
public int getButton() {
return button;
}
/**
* Sets the button to listen for, all other buttons are ignored. Default is {@link Buttons#LEFT}. Use -1 for any
* button.
*/
public void setButton(int button) {
this.button = button;
}
}