6
ドラッグ可能なボタンを実装しようとしています。ドラッグアンドドロップ検出器が機能しない
残念ながら、ドラッグが開始された後、システムはMotionEventsの送信を停止します。したがって、GestureDetector.OnGestureListener.onFling()メソッドは決して呼び出されません。
ドラッグシステムによって消費される前に、これらのイベントをインターセプトする方法はありますか?
私も自分自身のFlingDetectorを作成しようとしましたが、それは別のデバイスと画面密度渡って信頼性がありません。
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);
}
}
私はライブラリで同様のものを実装しました。 'GestureDetectorCompat' [here](https://github.com/ericbhatti/floaties/blob/master/FloatiesLibrary/floaties/src/main/java/com/bezyapps/floatieslibrary/Floaty.java)を参照してください。それが役に立てば幸い。 –
@timoschloesserドラッグしている間に場所にアクセスしようとしています....場所が非常に速く変化した場合。それは飛んでいる。 getAction()とACTION_DRAG_LOCATIONを試してみてください。私はあなたがどのようにスピードを測定できるのか分かりません。 –