[Android]なぞり書きをした軌跡を遅らせて表示する方法

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
THE_SATO

[Android]なぞり書きをした軌跡を遅らせて表示する方法

#1

投稿記事 by THE_SATO » 12年前

現在、音や振動、なぞり書きといった機能をわざと遅延実行させるような機能を持ったアプリを作ろうとしています。
現状は音や振動といった機能を遅延実行させることはできたのですが、なぞり書きの機能だけがうまく遅延実行させることができない状態です。

以下のプログラムのようにdelayFunc1,2 とおいて、主に①~④をいじりながら遅延させようと試みたのですが、実行すると触ってもいないところからなぞり書きがスタートしたり、なぞった軌跡とは全く異なる軌跡となったり、予想しない動作をしてしまいます。
どのように訂正すべきなのでしょうか?

コード:

 MotionEvent motion_e;

private final Runnable delayFunc1= new Runnable() {

    @Override
    public void run() {
        // 遅延実行したい処理

        path.moveTo(motion_e.getX(), motion_e.getY());
    }
};

private final Runnable delayFunc2= new Runnable() {

    @Override
    public void run() {
        // 遅延実行したい処理

        path.lineTo(motion_e.getX(), motion_e.getY());
    }
};

@Override
public boolean onTouchEvent(MotionEvent event) {
  switch (event.getAction()) {
    case MotionEvent.ACTION_DOWN :  
    	motion_e=event;
    	new Handler().postDelayed( delayFunc1,1000);//描画遅延実行1 ①
      new Handler().postDelayed( delayFunc,0);//音遅延実行
      path.moveTo(event.getX(), event.getY()); //②
      break;
      
    case MotionEvent.ACTION_MOVE:
    	motion_e=event;
      //path.lineTo(event.getX(), event.getY()); //③
      new Handler().postDelayed( delayFunc2,1000);//描画遅延実行2 
      break;
      
    case MotionEvent.ACTION_UP:
    	motion_e=event;
      //path.lineTo(event.getX(), event.getY()); //④
      new Handler().postDelayed( delayFunc2,1000);//描画遅延実行2      
      break;
    }
    invalidate();
    return true;
}

ISLe
記事: 2650
登録日時: 15年前
連絡を取る:

Re: [Android]なぞり書きをした軌跡を遅らせて表示する方法

#2

投稿記事 by ISLe » 12年前

motion_e変数が参照するMotionEventオブジェクトは、遅延指定した処理が実行されるころには、既に新しいタッチイベントで上書きされています。

遅延実行する処理に必要な情報は、コンストラクタを明示して引数で渡せば良いと思います。

onTouchEventの引数が参照しているMotionEventオブジェクトが使い回される可能性はゼロではない気がするので、複製したほうが良いかもしれません。
ただ整数型でx,y座標を渡すだけで良いですけども。

閉鎖

“C言語何でも質問掲示板” へ戻る