6

ジェスチャ検出器を実装して、他の画面へのナビゲーションのためにユーザーの入力をキャッチするアクティビティがあります。それは正常に機能していましたが、最近、BaseActivity から派生したクラスを更新して onClick 関数を追加しましたが、そのクリック イベントが onFling のヒットをブロックしているようです。onClick は、画面上にある TextView 領域 (LinearLayout 内) に関連付けられています。resultsClick メソッドは、XML レイアウトの onClick プロパティを使用して TextView に関連付けられています。

onSingleTapUp と onDown の戻り値を変更しようとしましたが、うまくいきませんでした。また、以下のすべての関数にもログステートメントを追加しようとしました。TextView 領域に飛び込んだときに起動するものはありませんが、画面の他の領域では起動します。

間違った検索用語を使用している可能性がありますが、これに対処する例を見つけることができなかったようですが、この問題は以前に解決されていると確信しています.

public class DerivedActivity extends BaseActivity
{
   ...
   /**
    * resultsClick - The user clicked on the Results area
    * @param v
    */
   public void resultsClick(View v)
   {
      try
      {
         Log.i(this.toString(), "resultsClick");
         startActivity(new Intent(this, Results_TabHost.class ));
      }
      catch (Exception e)
      {
         Log.e(this.toString(), "Exception" + e.toString());
      }

   }// end resultsClick
   ...
}

GestureListener コードを実装する基本クラスは次のとおりです。

public class BaseActivity extends    ActivityGroup 
                          implements OnGestureListener
{
   ...
   private static final int SWIPE_MIN_DISTANCE = 120;
   private static final int SWIPE_MAX_OFF_PATH = 250;
   private static final int SWIPE_THRESHOLD_VELOCITY = 200;

   public boolean onFling(MotionEvent e1, 
                          MotionEvent e2, 
                          float velocityX, 
                          float velocityY)
   {
      try
      {
         Log.i(this.toString(), "onFling");

         // jump right out if not a swipe/fling
         if (Math.abs( e1.getY() - e2.getY() ) > SWIPE_MAX_OFF_PATH)
         {
            return false;
         }

         // right to left swipe
         if (e1.getX() - e2.getX() > SWIPE_MIN_DISTANCE && 
             Math.abs(velocityX)   > SWIPE_THRESHOLD_VELOCITY )
         {
            Log.i(this.toString(), "fling left");
            rightArrowClick(null);

         }
         else if (e2.getX() - e1.getX() > SWIPE_MIN_DISTANCE && 
                  Math.abs(velocityX)   > SWIPE_THRESHOLD_VELOCITY )
         {
            Log.i(this.toString(), "fling right");
            leftArrowClick(null);
         }
      }
      catch (Exception e)
      {
         Log.e(this.toString(), "Exception" + e.toString());
      }

      return true;

   }// end onFling

   // These next methods we are required to have - even if unused - 
   // in order for the Gesture Handling to work

   @Override
   public boolean onTouchEvent(MotionEvent motionEvent)
   {
      return this.gestureDetector.onTouchEvent(motionEvent);
   }

   @Override
   public void onLongPress(MotionEvent e)
   {
      // Intentionally not handling - must be overridden by listener class
   }

   @Override
   public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY)
   {
      // Intentionally not handling - must be overridden by listener class
      // Intentionally returning true - per code examples
      return true;
   }

   @Override
   public void onShowPress(MotionEvent e)
   {
      // Intentionally not handling - must be overridden by listener class
   }

   @Override
   public boolean onSingleTapUp(MotionEvent e)
   {
      // Intentionally not handling - must be overridden by listener class
      // Intentionally returning true - per code examples
      return true;
   }

   @Override
   public boolean onDown(MotionEvent e)
   {
      // Intentionally not handling - must be overridden by listener class
      // Intentionally returning true - per code examples
      return true;
   }
...
}
4

4 に答える 4

4

onTouchEvent の実装が正しくありません。単純に、gestureDector の結果の値を返します。

ただし、ジェスチャー検出器がジェスチャーを検出しない場合は、発信者に「ここで行うことは何もありませんでした」と伝えると、タッチ イベントがアクティビティの子に送信されることはありません。

super.onTouchEvent()ジェスチャ検出器がイベントを処理しなかった場合は、呼び出す必要があります。

@Override
public boolean onTouchEvent(MotionEvent motionEvent)
{
  if(this.gestureDetector.onTouchEvent(motionEvent))
  {
      return true;
  }
  //no gesture detected, let Activity handle touch event
  return super.onTouchEvent(motionEvent);
}
于 2010-11-22T20:30:41.913 に答える
4

この機能に注意してください:

@Override
   public boolean onDown(MotionEvent e)
   {
      // Intentionally not handling - must be overridden by listener class
      // Intentionally returning true - per code examples
      return true;
   }

戻り値を false に変更してください。

于 2012-03-23T09:14:59.700 に答える
1

コードで何も実行されていない場合は、単に false を返すことができます...これにより、モーション イベント システムがすべてを独自に管理できるようになります。イベントが他の子ビューにディスパッチされるのを止めたい場合は、true を返します。

于 2011-05-02T20:49:38.223 に答える