最初にシングルタップをトリガーせずにダブルタップを検出したいのですが。私はダブルクリックリスナーを試しましたが、ダブルが検出される前に常に onSingleTapUp を取得します。これは妥当だと思います。しかし、私のアプリでは、途中でダブルクリックしたときにシングルクリックのコールバックが本当に必要ありません。
未来を予測できるアプリはありません(そうでなければ、本当に金持ちになるでしょう)が、シングルクリックでタイマーを起動し、タイムアウト内にダブルクリックがない場合は、シングルクリックを行うことを考えていました。しかし、タイマーを開始してタイマーが実行されると、2回目のタップでイベントが生成されないため、機能していないようです。これがayncタスクを使用した私のコードです。タイマーでも試しました。
mGD = new GestureDetector(getContext(), new SimpleOnGestureListener() {
@Override
public boolean onSingleTapUp(MotionEvent ev) {
//Log.d("KitView", "onSingleTapUp "+ev.toString());
class DblTapTask extends AsyncTask<Void, Void, Void> {
@Override
protected void onPreExecute() {
Log.d("KitView", "onPreExecute");
}
protected Void doInBackground(Void... args) {
Log.d("KitView", "doInBackground");
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return null;
}
protected void onPostExecute(Void result) {
Log.d("KitView", "onPostExecute");
doSigleTapAction();
mDblTapTask=null;
}
};
if(mDblTapTask==null) {
Log.d("KitView", "START TASK");
mDblTapTask = new DblTapTask();
mDblTapTask.execute();
} else {
Log.d("KitView", "TASK RUNNING");
doDoubleTapAction();
}
Log.d("KitView", "onSingleTapUp DONE");
return true;
} // end onSingleTapUp
}); // end new GestureDetector
この例では、最初のタップで問題なく onSingleTapUp を取得します。doInBackground でのテストのタイムアウトは 1 秒なので、2 回目のタップを行う時間は十分にあります。Log.d("KitView", "onSingleTapUp DONE"); に注意してください。すぐに実行されます。最初のタップを行うため、onSingleTapUp はハングしません。
問題は、1 秒以内にもう一度テーピングしても何も起こらないことです。スリープが終了して onPostExecute が実行されるまで、onSingleTapUp への呼び出しはありません。だから Log.d("KitView", "TASK RUNNING"); もちろん、ダブルクリックとシングルクリックを検出する場所は決して起こりません。
aynctask がイベントをブロックしている理由がわかりません。アイデアはありますか? ありがとう