android親コントロールと子コントロールをタッチイベント方式で処理


まずandroidにおけるイベントの伝達メカニズムを明らかにしなければならない.
dispatchTouchEvent->戻りtrue:自分のonTouchEventで処理
->falseに戻る:->
onInterceptTouchEvent->falseを返す:サブビューによるdispatchTouchEvent処理
->trueに戻る:->
onTouchEvent
システムのデフォルトはサブviewがタッチイベントを受信し、サブviewが処理すると親viewは処理しません.
もう一つ重要な問題は、サブviewがonTouchのdownイベントを処理できると、次のすべてのmove、upイベントがサブview処理に渡されることです.サブviewがdownイベントを処理できない場合、次のすべてのmoveイベントはupイベントも処理されません.
3つの方法があります
1,activityのdispatchTouchEvent,onTouchEventメソッドを書き換える
方法:onTouchEventまたはdispatchTouchEventを書き換え、親viewタッチイベントを自分で処理する
利点:activityに触れるだけでsetContenViewのビューではonTouchEventイベントが出発します.子ビューに触れても親ビューに触れても
劣勢:一般的にタッチポップアップダイアログボックスでonTouchEventイベントはトリガーされません
2,親viewのdispatchTouchEvent,onInterceptTouchEvent,onTouchメソッドを書き換える
方法1:dispatchTouchEventにfalseを返すよう強制する
結果:親viewはイベントを処理しますサブviewは処理しません
方法2:onInterceptTouchEventにtrueを返すよう強制する
結果:同じ1
方法3:方法1または方法2を使用して、自分でonTouchイベントを書き換え、サブViewのタッチイベントを処理する
あるいは,メソッド1,2で直接処理関数を増やし,強制的に値を返さなくてもよい.
    @Override
    public boolean dispatchTouchEvent(MotionEvent ev)
    {
        if(touchListener!=null)
        {
            touchListener.onTouch(null,ev);
        }
        return super.dispatchTouchEvent(ev);
    }

結果:親viewと子viewを同時にタッチイベントを処理できるが、面倒であり、タッチ座標を取得するには相対位置の詳細な計算が必要である
3,サブviewを書き換えるdispatchTouchEvent,onTouchメソッド
方法1:onTouchにfalseを返すように強制する
結果:親viewと子viewはdownイベントを処理できますが、moveイベントとupイベントの親viewは処理できません
まとめ:関連するviewにダイアログボックスが含まれていない場合は1、ダイアログボックスが含まれている場合は2