Sto provando a implementare un pulsante trascinabile che dovrebbe essere anche flingable.Drag and Drop + Rilevatore fiammifero non funzionante
Sfortunatamente il sistema interrompe l'invio di MotionEvents dopo l'avvio del trascinamento. Pertanto, il metodo GestureDetector.OnGestureListener.onFling() non viene mai chiamato.
C'è un modo per intercettare quegli eventi prima che vengano consumati dal sistema di trascinamento?
Ho anche cercato di creare il mio FlingDetector, ma non è affidabile su dispositivi diversi e densità dello schermo:
public class FlingDetector {
private final int MIN_FLING_SPEED = 3;
private OnFlingListener mOnFlingListener;
private float mCurrentX = 0;
private float mCurrentY = 0;
private long mLastMovementTime = 0;
private double mCurrentVelocity = 0;
private final float mDensity;
public FlingDetector(OnFlingListener onFlingListener, Context context) {
mOnFlingListener = onFlingListener;
mDensity = context.getResources().getDisplayMetrics().density;
}
public void onMovementStart(float x, float y) {
mCurrentX = x;
mCurrentY = y;
mLastMovementTime = System.currentTimeMillis();
mCurrentVelocity = 0;
}
public void onMovementEnd(float x, float y) {
long currentTime = System.currentTimeMillis();
float distanceX = Math.abs(mCurrentX - x)/mDensity;
float distanceY = Math.abs(mCurrentY - y)/mDensity;
float distance = (float) Math.sqrt(Math.pow(distanceX, 2) +
Math.pow(distanceY, 2));
mCurrentVelocity = (distance/(currentTime - mLastMovementTime));
if(mCurrentVelocity > MIN_FLING_SPEED) {
mOnFlingListener.onFling((int) (mCurrentVelocity + 0.5));
} else {
Log.d("test", "Distance: " + distance);
Log.d("test", "Time Delta: " + (currentTime - mLastMovementTime));
Log.d("test", "Speed: " + mCurrentVelocity);
}
}
public interface OnFlingListener {
void onFling(int speed);
}
}
Ho implementato qualcosa di simile in una libreria. Vedere "GestureDetectorCompat" [qui] (https://github.com/ericbhatti/floaties/blob/master/FloatiesLibrary/floaties/src/main/java/com/bezyapps/floatieslibrary/Floaty.java). Spero che sia d'aiuto. –
@timoschloesser tenta di accedere alla posizione mentre viene trascinato .... e se la posizione è cambiata molto velocemente. è lanciato. prova a utilizzare getAction() e ACTION_DRAG_LOCATION. non so come puoi misurare la velocità. –