2017-10-04 6 views
0

私はチャイルドがたくさんあるという意見があります。私が必要とするのは、スワイプやフリングの動きに対する反応を実装することです。問題は、すべてのチャイルドを削除した場合にのみ実際に機能することです。それ以外の場合は、メインレイアウトの上にある子ビューは、スワイプする試行をブロックします。上のビューを無視してonFling(onSwipe)を検出する方法はありますか?

メインレイアウトにonSwipeListenerを追加し、同じ成功を収めたアクティビティ全体にGestureListenerを追加することを試みました。繰り返すに

protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_schedule); 

     main_layout = findViewById(R.id.schedule_main_view); 
     Animation fadeInAnimation = AnimationUtils.loadAnimation(this, R.anim.fade); 
     main_layout.startAnimation(fadeInAnimation); 

     GestureDetector.SimpleOnGestureListener simpleOnGestureListener = 
       new GestureDetector.SimpleOnGestureListener() { 
        @Override 
        public boolean onDown(MotionEvent event) { 
         return true; 
        } 

        @Override 
        public boolean onFling(MotionEvent event1, MotionEvent event2, 
              float velocityX, float velocityY) { 
         Log.d(null,"Fling"); 
         int dx = (int) (event2.getX() - event1.getX()); 
         // don't accept the fling if it's too short 
         // as it may conflict with a button push 
         if (Math.abs(dx) > 20 
           && Math.abs(velocityX) > Math.abs(velocityY)) { 
          if (velocityX > 0) { 
           Log.d(DEBUG_TAG, "onFling: " + event1.toString() + event2.toString()); 
           Log.d(DEBUG_TAG, "onFling To Right"); 
          } else { 
           Log.d(DEBUG_TAG, "onFling: " + event1.toString() + event2.toString()); 
           Log.d(DEBUG_TAG, "onFling To Left"); 
          } 
          return true; 
         } else { 
          return false; 
         } 
        } 
       }; 

     shift = getIntent().getIntExtra(WEEK_SHIFT, CURRENT_WEEK); 
     mDetector = new GestureDetectorCompat(this,simpleOnGestureListener); 
     unDimScreen(); 
     setupWeek(); 
    } 

私の現在の(非稼働)ソリューションは、のように見える活動が意図したとおり、それは動作しますが、最上部には子ビューが存在しないときの状態にある場合。

質問:上に表示されたビューを無視して、アクティビティフェッチジェスチャを行うにはどうすればよいですか?

答えて

1

問題は、子イベントがタッチイベントを取得し、それを親に与えないことです。 オーバーレイビューのクリック可能なイベントで使用していない場合は、view.setClickable(false);のようなビューのクリック可能なプロパティをオフにできます。次に、すべてのクリックイベントがその親ビューになります。それがない作品を行う場合は、このようなすべての上にあるビューにタッチリスナーに定義することができます。

view.setOnTouchListener(new View.OnTouchListener() { 
    @Override 
    public boolean onTouch(View view, MotionEvent motionEvent) { 
     return false; 
    } 
}); 

UPD:ここ この問題の別の(右)ソリューション:https://developer.android.com/training/gestures/viewgroup.html#delegate

+1

ViewGroupのIntercept Touch Eventsが私の必要なものです。ありがとうございました! –

0

android:clickable="true"を設定してみてくださいxmlファイルでスワイプしたいビューにandroid:descendantFocusability="blocksDescendants"と入力します。これにより、子供がクリックイベントを受け取るのをブロックする必要があります。

+0

それは動作しませんが、ありがとう –

関連する問題