一定時間画面をタッチするとダイアログを表示する

どうもお久しぶりです。kishidaです。

今年も本格的に熱くなって来ました。

休日に家にいると日中は完全にダウン状態で日没後にようやく動き出すような生活をしています。

冷房を使えばいいだけなのですがもう5~6年ぐらい冷房無しで過ごしているせいか意地になって逆に使わない感じになってます。

 

暑いの(ダウン)には慣れました。

 

 

一定時間タッチしたままでいるとダイアログを表示する処理

final int TIMER  = 1000 * 3;  //3000ミリ秒
final int MARGIN = 30;       //タッチ時の誤差
AsyncTask task;

view.setOnTouchListener(new OnTouchListener() {
  int x=0,y=0;

  @Override
  public boolean onTouch(View v, MotionEvent event) {
    switch ( event.getAction() ) {

      //タッチした
      case MotionEvent.ACTION_DOWN:
        x = (int)event.getX();
        y = (int)event.getY();
        task = new AsyncTask() {
          @Override
          protected Boolean doInBackground(final Integer... timer) {
            try{
              Thread.sleep(timer[0]);
            }catch(InterruptedException  e){
              return false;
            }
            return true;
          }

          @Override
          protected void onPostExecute(Boolean result) {
            /*****ダイアログ表示処理*****/
          }

          @Override
          protected void onCancelled() {
          }
        };
        task.execute(TIMER);
        break;

        //タッチしたまま移動
      case MotionEvent.ACTION_MOVE:
          //一定以上動いたらリセット
          if( x + MARGIN < (int)event.getX() || x - MARGIN > (int)event.getX() ||
            y + MARGIN < (int)event.getY() || y - MARGIN > (int)event.getY()){

            task.cancel(true);
            task = new AsyncTask() {
              @Override
              protected Boolean doInBackground(Integer... timer) {
                try{
                  Thread.sleep(timer[0]);
                }catch(InterruptedException  e){
                  return false;
                }
                return true;
              }
              @Override
              protected void onPostExecute(Boolean result) {
                /*****ダイアログ表示処理*****/
              }
              @Override
              protected void onCancelled() {
              }
            };
            task.execute(TIMER);
            x = (int)event.getX();
            y = (int)event.getY();
          }
        break;

     //画面から離れたorキャンセルされた
      case MotionEvent.ACTION_UP:
      case MotionEvent.ACTION_CANCEL:
        task.cancel(true);
        break;
      }
      return false;
    }
});
//タッチしたまま移動
case MotionEvent.ACTION_MOVE:
  //一定以上動くようならカウントリセット
  if( x + MARGIN < (int)event.getX() || x - MARGIN > (int)event.getX() ||
    y + MARGIN < (int)event.getY() || y - MARGIN > (int)event.getY()){

タッチ部分が少しでもずれるとonTouchが呼ばれcase MotionEvent.ACTION_MOVEが動作するため少し余裕を持たせる。

try{
  Thread.sleep(timer[0]);
}catch(InterruptedException  e){
  return false;
}

時間を計測。cancelメソッドを呼ぶとInterruptedExceptionが出るのでそれを利用する。

以上

カテゴリー: Android

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

*