に親から取り扱いインターセプトだから私は、次のビューの構造を有する:アンドロイド:タッチジェスチャが、子ビュー
- のLinearLayout
- HorizontalScrollView
- 他の子ビュー
親LinearLayoutはクリック可能で、カスタムセレクタを持ちます(c押されると色がつぶれます)。私は、LinearLayout内のHorizontalScrollViewに触れることができ、それがスクロールモーションでない限り、LinearLayoutでタッチを処理したいと考えています。スクロールモーションを行うと、HorizontalScrollViewはジェスチャをインターセプトし、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);
}
HorizontalScrollView
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を。 HorizontalScrollViewをタッチすると、LinearLayoutは押された状態のUIを表示し、クリックが完了するとアクティブになります。 HorizontalScrollViewをタッチしてスクロールすると、スクロールが機能します。スクロールをやめると、LinearLayoutのクリックハンドラは傍受されたため起動しません。しかし問題は、LinearLayoutのスクロールを開始する前に、押された状態に変わり、ジェスチャが完了した後でもリセットされないことです。 LinearLayoutのジェスチャーを手動でキャンセルしようとする私の追加の試みで、私は他の問題に取り組んでいました。さらに、LinearyLayoutには他のボタンがあり、クリックすると親のLinearLayoutに押された状態が表示されないようにすべきです。助言がありますか?子供からのタッチイベントを傍受するための設定パターンがありますか?両方のクラスがお互いを知っていれば可能だと思いますが、それらを結合するのを避けようとしています。