2017-05-12 10 views
1

に親から取り扱いインターセプトだから私は、次のビューの構造を有する:アンドロイド:タッチジェスチャが、子ビュー

  • のLinearLayout
    • Horizo​​ntalScrollView
    • 他の子ビュー

親LinearLayoutはクリック可能で、カスタムセレクタを持ちます(c押されると色がつぶれます)。私は、LinearLayout内のHorizo​​ntalScrollViewに触れることができ、それがスクロールモーションでない限り、LinearLayoutでタッチを処理したいと考えています。スクロールモーションを行うと、Horizo​​ntalScrollViewはジェスチャをインターセプトし、LinearLayoutのタッチをキャンセルする必要があります。基本的には、標準である親からではなく、子ビューからのジェスチャーを傍受できるようにしたい。

私は、次の操作を行う拡張クラスを作成することによって、手動でMotionEventを処理しようとしている:これはほとんど働いていた

public override bool OnInterceptTouchEvent(MotionEvent ev) 
{ 
    // Handle the motion event even if a child returned true for OnTouchEvent 
    base.OnTouchEvent(ev); 
    return base.OnInterceptTouchEvent(ev); 
} 

Horizo​​ntalScrollView

public override bool OnTouchEvent(MotionEvent e) 
{ 
    if (e.Action == MotionEventActions.Down) 
    { 
     _intialXPos = e.GetX(); 
    } 

    if (e.Action == MotionEventActions.Move) 
    { 
     float xDifference = Math.Abs(e.GetX() - _intialXPos); 
     if (xDifference > _touchSlop) 
     { 
      // Prevent the parent OnInterceptTouchEvent from being called, thus it will no longer be able to handle motion events for this gesture 
      Parent.RequestDisallowInterceptTouchEvent(true); 
     } 
    } 

    return base.OnTouchEvent(e); 
} 

のLinearLayoutを。 Horizo​​ntalScrollViewをタッチすると、LinearLayoutは押された状態のUIを表示し、クリックが完了するとアクティブになります。 Horizo​​ntalScrollViewをタッチしてスクロールすると、スクロールが機能します。スクロールをやめると、LinearLayoutのクリックハンドラは傍受されたため起動しません。しかし問題は、LinearLayoutのスクロールを開始する前に、押された状態に変わり、ジェスチャが完了した後でもリセットされないことです。 LinearLayoutのジェスチャーを手動でキャンセルしようとする私の追加の試みで、私は他の問題に取り組んでいました。さらに、LinearyLayoutには他のボタンがあり、クリックすると親のLinearLayoutに押された状態が表示されないようにすべきです。助言がありますか?子供からのタッチイベントを傍受するための設定パターンがありますか?両方のクラスがお互いを知っていれば可能だと思いますが、それらを結合するのを避けようとしています。

答えて

0

すべてのケースのために私のために、次の作業:

InterceptableLinearLayout

public override bool DispatchTouchEvent(MotionEvent e) 
{ 
    bool dispatched = base.DispatchTouchEvent(e); 
    // Handle the motion event even if a child returns true in OnTouchEvent 
    // The MotionEvent may have been canceled by the child view 
    base.OnTouchEvent(e); 

    return dispatched; 
} 

public override bool OnTouchEvent(MotionEvent e) 
{ 
    // We are calling OnTouchEvent manually, if OnTouchEvent propagates back to this layout do nothing as it was already handled. 
    return true; 
} 

InterceptCapableChildView

public override bool OnTouchEvent(MotionEvent e) 
{ 
    bool handledTouch = base.OnTouchEvent(e); 

    if ([Meets Condition to Intercept Gesture]) 
    { 
     // If we are inside an interceptable viewgroup, intercept the motionevent by sending the cancel action to the parent 
     e.Action = MotionEventActions.Cancel; 
    } 

    return handledTouch; 
} 
関連する問題