2017-01-04 6 views
0

Iは、以下の場合にonTouchEvent()方法を使用しています:ドラッグ方法が遅れているのはなぜですか?

case MotionEvent.ACTION_MOVE: 
       if (motionEvent.getHistorySize() > 0) { 
        for (int i = 1, n = motionEvent.getHistorySize(); i < n; i++) { 
         int calcX = (int) motionEvent.getHistoricalX(i) - (int) motionEvent.getHistoricalX(i - 1); 
         treesX += calcX; 
        } 
       } 
break; 

treesX変数は、背景がビットマップとして描画される点を表し、そして他の背景が画面幅とその隣描かに添加されますtreesX、および画面の幅は、次のコードに示すように、両方の画像は、シームレスな背景の効果を与えるために1つの画面幅バックジャンプスクロールされた後:

public void draw() { 
     if (ourHolder.getSurface().isValid()) { 
      canvas = ourHolder.lockCanvas(); 

      if ((int) treesX < -screenWidth) { 
       treesX += screenWidth; 
      } 
      if ((int) treesX > 0) { 
       treesX -= screenWidth; 
      } 
      canvas.drawBitmap(trees, null, new Rect((int) treesX, 0, screenWidth + (int) treesX, screenHeight), paint); 
      canvas.drawBitmap(trees, null, new Rect((int) treesX + screenWidth, 0, 2 * screenWidth + (int) treesX, screenHeight), paint); 

      } 
      ourHolder.unlockCanvasAndPost(canvas); 
     } 

これは、2つの背景は、常に次の権利でなければならないことを意味しお互いに、 しかし、私は画面をスクロールすると、少し離れたり重なり合ったりしますが、これを修正できる方法はありますか?それらを同期させないコードの部分はどれですか?

答えて

1

ユーザーがドラッグすると、ACTION_MOVEで多くのMotionEventが返されます。各イベントの履歴サイズは最後のものよりも大きくなります。これは、あなたのループを長くするほど、ループを長くするか、指を押し下げる時間が長くなることを意味します。

ドラッグされた現在の距離を把握するために、すべての履歴値をループする必要はありません。最初のACTION_DOWNのX値を保存してから、それぞれのACTION_MOVEに最新のX値と保存した値を比較してください。

関連する問題