偽代碼10分鐘解釋android事件分發(fā)別窮舉一些大圖整些有的沒的

到一些解釋android事件分發(fā)的巫湘,基本都是窮舉一些所有情況整幾個(gè)大圖,名詞概念搬一搬厕倍,也不說為什么會這樣寡壮,3個(gè)方法的牽扯關(guān)系究竟為何,很長讹弯,實(shí)戰(zhàn)或面試的時(shí)候能拿來用嗎况既?本人不才,認(rèn)為以下的偽代碼基本能搞定事件分發(fā)组民,為圖簡單Event參數(shù)都不要了棒仍,只解釋核心,自己自定義view的時(shí)候也可以直接跟著用邪乍,請賜教


public class IView{ 

 public boolean dispatchTouchEvent() {
     return onTouchEvent();
 }
 public  boolean onTouchEvent() {
   //可以通過setOnTouchListener等消費(fèi)則  return true        return false;
  }

}
public class IViewGroup extends IView {
public List<IView> childs = new ArrayList<>();
 //注釋1:理解事件分發(fā)有個(gè)容易被忽視的前提就是ViewGroup是繼承的View
 //雖然ViewGroup沒有實(shí)現(xiàn)onTouchEvent 
 //但是super.dispatchTouchEvent調(diào)用的就是super.onTouchEvent
// 即他自己的onTouchEvent
    public boolean onInterceptTouchEvent() {
        return false;//
    }

    @Override
    public boolean dispatchTouchEvent() {
        if (true) {
            //這個(gè)true就是
            //  final int action = ev.getAction();
            // final int actionMasked = action & MotionEvent.ACTION_MASK;
            // actionMasked == MotionEvent.ACTION_DOWN
            resetTouchState();//FLAG_DISALLOW_INTERCEPT==false
            //這里的意思就是findid后 直接調(diào)requestDisallowInterceptTouchEvent沒有暖用
            //此處被重置 為false需要在這個(gè)if后面調(diào)
        }

        if (!FLAG_DISALLOW_INTERCEPT && onInterceptTouchEvent()) {
 //只有FLAG_DISALLOW_INTERCEPT為false才去判斷onInterceptTouchEvent
            super.dispatchTouchEvent();//注釋1
        } else {
            for (int i = 0; i < childs.size(); i++) {
                if (childs.get(i).dispatchTouchEvent()) {
                    return true;
                    //只要有一個(gè)child View的dispatchTouchEvent(注釋1)返回true
                    //已經(jīng)return那么后續(xù)的view也拿不到 super(他自己)也拿不到
                }
            }
        }
        return super.dispatchTouchEvent();
    }

    private boolean FLAG_DISALLOW_INTERCEPT = false; //是否禁止打斷

    public void requestDisallowInterceptTouchEvent(boolean disallowIntercept) {
        FLAG_DISALLOW_INTERCEPT = disallowIntercept;
        //如果viewgroup有父就 parent.requestDisallowInterceptTouchEvent(disallowIntercept)

    }

    public void resetTouchState() {
        FLAG_DISALLOW_INTERCEPT = false;
    }
}

小總結(jié) 背了下面這個(gè)偽代碼
這個(gè)執(zhí)行順序和相互關(guān)系隨便問

if (降狠!禁止打斷()&& 是否打斷()) {
 viewgroup可以要了
}else{
for (int i = 0; i < childs.size(); i++) {
if (somechild.要//即somechild.onTouchEvent) {
     return true;
}
}
}

return    viewgroup可以要了

小總結(jié)

<font color=RED face="楷體" size=5>
父想要咋辦 1.使!禁止打斷()&& 是否打斷() 為true 2. child.要全為false
子想要咋辦 1.禁止打斷為true 2.要的那個(gè)view的child.要為true
</font>
<font color=#123456 face="楷體" size=5>
完事 so easy 如果還沒有概括不了情況 歡迎指正
另外誰能告訴我這個(gè)簡書文字怎么不變色~2333
</font>

記住上面基本就可以了 如果你還想考慮move down up

如果你還想考慮到down move

View mTarget=null;//保存捕獲Touch事件處理的View
    public boolean dispatchTouchEvent(MotionEvent ev) {

        //....其他處理庇楞,在此不管

        if(ev.getAction()==KeyEvent.ACTION_DOWN){
            //每次Down事件榜配,都置為Null

            if(FLAG_DISALLOW_INTERCEPT ||!onInterceptTouchEvent()){
            mTarget=null;
            View[] views=getChildView();
            for(int i=0;i<views.length;i++){
                if(views[i].dispatchTouchEvent(ev))
                    mTarget=views[i];
                    return true;
            }
          }
        }
        //當(dāng)子View沒有捕獲down事件時(shí),ViewGroup自身處理吕晌。這里處理的Touch事件包含Down蛋褥、Up和Move
        if(mTarget==null){
            return super.dispatchTouchEvent(ev);
        }
        //...其他處理,在此不管
        if(onInterceptTouchEvent()){
         //...其他處理睛驳,在此不管    
         }
//這一步在Action_Down中是不會執(zhí)行到的烙心,只有Move和UP才會執(zhí)行到膜廊。
        return mTarget.dispatchTouchEvent(ev);

    }
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市淫茵,隨后出現(xiàn)的幾起案子爪瓜,更是在濱河造成了極大的恐慌,老刑警劉巖匙瘪,帶你破解...
    沈念sama閱讀 206,482評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件铆铆,死亡現(xiàn)場離奇詭異,居然都是意外死亡丹喻,警方通過查閱死者的電腦和手機(jī)薄货,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,377評論 2 382
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來碍论,“玉大人谅猾,你說我怎么就攤上這事△⒂疲” “怎么了税娜?”我有些...
    開封第一講書人閱讀 152,762評論 0 342
  • 文/不壞的土叔 我叫張陵,是天一觀的道長贼涩。 經(jīng)常有香客問我巧涧,道長,這世上最難降的妖魔是什么遥倦? 我笑而不...
    開封第一講書人閱讀 55,273評論 1 279
  • 正文 為了忘掉前任谤绳,我火速辦了婚禮,結(jié)果婚禮上袒哥,老公的妹妹穿的比我還像新娘缩筛。我一直安慰自己,他們只是感情好堡称,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,289評論 5 373
  • 文/花漫 我一把揭開白布瞎抛。 她就那樣靜靜地躺著,像睡著了一般却紧。 火紅的嫁衣襯著肌膚如雪桐臊。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,046評論 1 285
  • 那天晓殊,我揣著相機(jī)與錄音断凶,去河邊找鬼。 笑死巫俺,一個(gè)胖子當(dāng)著我的面吹牛认烁,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 38,351評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼却嗡,長吁一口氣:“原來是場噩夢啊……” “哼舶沛!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起窗价,我...
    開封第一講書人閱讀 36,988評論 0 259
  • 序言:老撾萬榮一對情侶失蹤如庭,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后舌镶,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體柱彻,經(jīng)...
    沈念sama閱讀 43,476評論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡豪娜,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,948評論 2 324
  • 正文 我和宋清朗相戀三年餐胀,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片瘤载。...
    茶點(diǎn)故事閱讀 38,064評論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡否灾,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出鸣奔,到底是詐尸還是另有隱情墨技,我是刑警寧澤,帶...
    沈念sama閱讀 33,712評論 4 323
  • 正文 年R本政府宣布挎狸,位于F島的核電站扣汪,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏锨匆。R本人自食惡果不足惜崭别,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,261評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望恐锣。 院中可真熱鬧茅主,春花似錦、人聲如沸土榴。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,264評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽玷禽。三九已至赫段,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間矢赁,已是汗流浹背糯笙。 一陣腳步聲響...
    開封第一講書人閱讀 31,486評論 1 262
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留坯台,地道東北人炬丸。 一個(gè)月前我還...
    沈念sama閱讀 45,511評論 2 354
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親稠炬。 傳聞我的和親對象是個(gè)殘疾皇子焕阿,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,802評論 2 345

推薦閱讀更多精彩內(nèi)容