Donc j'essaye de faire une application de type "poésie magnétique". Les utilisateurs déplacent divers widgets Button sur l'écran. J'utilise un widget Button car il est le plus proche du look de l'aimant, même si je suis ouvert à d'autres options!Glisser-déposer pour Android plus ancien pas précis
Les objets ne bougent pas correctement avec mon doigt. Ils sont proches, mais ils ne correspondent pas exactement à mon doigt. La coordonnée X sur mon téléphone semble aller bien, mais le Y corrdinate est éteint. Est-ce peut-être dû à la barre de titre?
private final static int DRAGGING_OFF = 0;
private final static int DRAGGING_ON = 1;
private int dragStatus;
private GestureDetector mGestureDetector;
private int mOffsetX;
private int mOffsetY;
private LayoutParams mOldParams;
private RelativeLayout.LayoutParams lp;
@Override
public boolean onTouchEvent(MotionEvent event) {
if(!mGestureDetector.onTouchEvent(event)) {
if(event.getAction() == MotionEvent.ACTION_MOVE) {
if(dragStatus == DRAGGING_ON) {
Log.e(VIEW_LOG_TAG, "Dragging! RAW -- " + event.getRawX() + " : " + event.getRawY() + " NOT RAW -- " + event.getX() + " : " + event.getY());
int rawX, rawY;
int finalX, finalY;
rawX = (int) event.getRawX();
rawY = (int) event.getRawY();
finalX = rawX - mOffsetX;
finalY = rawY - mOffsetY;
lp.setMargins(finalX, finalY, 0, 0);
this.setLayoutParams(lp);
}
return true;
} else if(event.getAction() == MotionEvent.ACTION_UP) {
if(dragStatus == DRAGGING_ON) {
dragStatus = DRAGGING_OFF;
Log.e(VIEW_LOG_TAG, "Stopped dragging!");
}
return true;
} else {
return super.onTouchEvent(event);
}
} else {
return true;
}
}
private final GestureDetector.SimpleOnGestureListener mListener = new GestureDetector.SimpleOnGestureListener() {
@Override
public boolean onDown(MotionEvent e) {
int[] location = new int[2];
Log.e(VIEW_LOG_TAG, "Down! RAW -- " + e.getRawX() + " : " + e.getRawY() + " NOT RAW -- " + e.getX() + " : " + e.getY());
dragStatus = DRAGGING_ON;
// Sets the current location of the View in the int[] passed to it; x then y.
getLocationInWindow(location);
Log.e(VIEW_LOG_TAG, "Down location: " + location[0] + " " + location[1]);
mOffsetX = (int) e.getRawX() - location[0];
mOffsetY = (int) e.getRawY() - location[1];
mOldParams = getLayoutParams();
return true;
}
};
Cela semble être une méthode réalisable. J'ai juste besoin de le tester avec getLocationInWindow() pour m'assurer que les nombres que je reçois à partir de là peuvent être utilisés directement pour faire des maths et retourner à LayoutParams.setMargins() – tomwardiii
Donc il se trouve que le problème que je rencontrais n'était pas lié à l'utilisation de ma méthode ou en utilisant la méthode delta que vous avez suggérée. Il semble être plus lié à la barre de titre et à la hauteur de la barre d'état. Les nombres que je reçois sont relatifs à l'écran mais les informations sur l'emplacement que je définis sont supposées être relatives à la fenêtre, donc il est désactivé sur la coordonnée Y. Quelqu'un a trouvé ça pour moi: http://andmobidev.blogspot.com/2010/01/getting-height-of-status-and-title-bar.html – tomwardiii