数か月後にこれに戻ると、私は別の方法に従いました。(Android Snake サンプルのように) Handler を使用して、125 ミリ秒ごとにアプリにメッセージを送信し、スクロールが開始されたかどうかを確認するように促し、最後のスクロール イベントから 100 ミリ秒以上経過したかどうか。
これはかなりうまくいっているようですが、誰かが欠点や改善の可能性を確認できる場合は、それらを聞いて感謝する必要があります.
関連するコードは MyView クラスにあります。
public class MyView extends android.view.View {
...
private long timeCheckInterval = 125; // milliseconds
private long scrollEndInterval = 100;
public long latestScrollEventTime;
public boolean scrollInProgress = false;
public MyView(Context context) {
super(context);
}
private timeCheckHandler mTimeCheckHandler = new timeCheckHandler();
class timeCheckHandler extends Handler{
@Override
public void handleMessage(Message msg) {
long now = System.currentTimeMillis();
if (scrollInProgress && (now>latestScrollEventTime+scrollEndInterval)) {
scrollInProgress = false;
// スクロールが終了したので、ここにコードを挿入します
// doDrawing() メソッドを呼び出す
// スクロールが終了した位置でビットマップを再中央に再描画します
[ layout or view ].invalidate();
}
this.sleep(timeCheckInterval);
}
public void sleep(long delayMillis) {
this.removeMessages(0);
sendMessageDelayed(obtainMessage(0), delayMillis);
}
}
}
@Override protected void onDraw(Canvas canvas){
super.onDraw(canvas);
// 大きなバッファ ビットマップをビューのキャンバスに描画するコード // 進行中のスクロールを考慮して配置
}
public void doDrawing() {
// 詳細な (そして時間のかかる) 描画を行うコード // 大きなバッファ ビットマップに
// 次の命令はタイム チェック クロックをリセットします // クロックは、アプリの起動時にメイン アクティビティがこのメソッドを呼び出したときに // 最初に開始されます
mTimeCheckHandler.sleep(timeCheckInterval);
}
// MyView クラスの残りの部分
}
および MyGestureDetector クラスで
public class MyGestureDetector extends SimpleOnGestureListener {
@Override
public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX,
float distanceY) {
[MyView].scrollInProgress = true;
long now = System.currentTimeMillis();
[MyView].latestScrollEventTime =now;
[MyView].scrollX += (int) distanceX;
[MyView].scrollY += (int) distanceY;
// 次の命令により、View の onDraw メソッドが呼び出されます // これにより、バッファ ビットマップが画面に描画されます // スクロールを考慮してシフトされます
[MyView].invalidate();
}
// MyGestureDetector クラスの残りの部分
}