<!--親の顔より見た光景-->

日々の発見を残していきます。

イベント処理に関する連打を禁止させる

現在SurfaceViewでカメラ制御を行っている。

SurfaceViewにOnClickListenerを実装しており、画面をタッチすると、オートフォーカス→撮影→保存→画像処理・並行してダイアログの表示...と処理をしてくれる。

f:id:akagi13213:20161105110250p:plain

ここで問題となるのがSurfaceViewを連続でクリックされること。

ダイアログが表示されてからはDialogクラスで用意されているsetCanceledOnTouchOutside()メソッドによってタッチ操作を受け付けなく出来る。

しかし、ダイアログが現れるまでのコンマ数秒の間に画面をタッチするとSurfaceViewのOnClickListenerが反応してしまう。→処理が重複する

 

連打を禁止させる方法を探したところ、以下サイト様により解決。

Android でのボタン連打制御 (onClick) - 戌印-INUJIRUSHI- (Androidあれこれ) -

 

以下ソースコードの一部

// クラス内変数------------------------------------------------------------------------

// 前回クリックした時の時間 最初のクリックは通すので初期値は0
private static long last_click_time = 0; 

// 連続クリックの対策として、間隔を1秒設ける

private static long CLICK_DELAY = 1000; 

// ------------------------------------------------------------------------------------------

/* 中略 */

// SurfaceViewのリスナー
private final View.OnClickListener onSurfaceClickListener = new View.OnClickListener() {
  @Override
  public void onClick( View view )
  {
    // 前回のクリックから十分な時間が経過したか
    if ( isPassedEnoughTime() ) {
      if ( myCamera != null ) {
        // AutoFocusを実行
        myCamera.autoFocus( autoFocusCallback );
      }
    }
    else {
      Log.i( "onClick_surfaceView", "not passed enough time" );
    }
  }
};

/*
* 前回のクリックからの十分な時間が過ぎたか判定
* @param なし
* @return 過ぎたならtrue 過ぎていないならfalse
*/
private static boolean isPassedEnoughTime()
{
  boolean result = true;
  long current_time = System.currentTimeMillis(); // 現在時刻をミリ単位秒で受け取る
  if ( current_time - last_click_time < CLICK_DELAY ) { // 前回のクリック時間と現在時刻の差から連続クリックの間隔を求める
    result = false;
  }
  last_click_time = current_time;
  return result;
}