ViewGroup事件分發(fā)

廢話不說先上代碼

布局文件

<?xml version="1.0" encoding="utf-8"?>
<com.example.cc.eventdemo.MyRelativeLayout
  xmlns:android="http://schemas.android.com/apk/res/android"
  xmlns:app="http://schemas.android.com/apk/res-auto"
  xmlns:tools="http://schemas.android.com/tools"
  android:id="@+id/parent"
  android:layout_width="match_parent"
  android:layout_height="match_parent"
  tools:context="com.example.cc.eventdemo.MainActivity">

 <Button
      android:id="@+id/button"
      android:layout_width="wrap_content"
      android:layout_height="wrap_content"
      android:text="button"
      android:textAllCaps="false"/>
  <com.example.cc.eventdemo.MyButton
    android:id="@+id/mybtn"
    android:textAllCaps="false"
    android:text="mybutton"
    android:layout_width="wrap_content"        
    android:layout_height="wrap_content"
    android:layout_centerInParent="true">
   </com.example.cc.eventdemo.MyButton>
 </com.example.cc.eventdemo.MyRelativeLayout>

兩個(gè)自定義view的代碼

自定義MyButton

  public class MyButton extends Button {

 public MyButton(Context context) {
      this(context,null);
  }
public MyButton(Context context, AttributeSet attrs) {
    this(context, attrs,0);
}
public MyButton(Context context, AttributeSet attrs, int defStyleAttr) {
    super(context, attrs, defStyleAttr);
}

@Override
public boolean dispatchTouchEvent(MotionEvent event) {
    Log.d("123", "dispatchTouchEvent:MyButton: "+event.getAction());
    return super.dispatchTouchEvent(event);
}

@Override
public boolean onTouchEvent(MotionEvent event) {
    Log.d("123", "onTouchEvent: MyButton:"+event.getAction());
    return  super.onTouchEvent(event);
}
}

自定義RelativeLayout

 public class MyRelativeLayout extends RelativeLayout {
public MyRelativeLayout(Context context) {
    super(context);
}

public MyRelativeLayout(Context context, AttributeSet attrs) {
    super(context, attrs);
}

public MyRelativeLayout(Context context, AttributeSet attrs, int defStyleAttr) {
    super(context, attrs, defStyleAttr);
}


@Override
public boolean dispatchTouchEvent(MotionEvent ev) {
    Log.d("123", "dispatchTouchEvent: MyRelativeLayout:"+ev.getAction());
    return super.dispatchTouchEvent(ev);
}

@Override
public boolean onInterceptTouchEvent(MotionEvent ev) {
    Log.d("123", "onInterceptTouchEvent: MyRelativeLayout:"+ev.getAction());
    return super.onInterceptTouchEvent(ev);
}


@Override
public boolean onTouchEvent(MotionEvent event) {
    Log.d("123", "onTouchEvent: MyRelativeLayout:"+event.getAction());
    return super.onTouchEvent(event);
}

}

MainActivity代碼

public class MainActivity extends AppCompatActivity implements View.OnTouchListener, View.OnClickListener {

private MyButton mMyButton;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    Button button = findViewById(R.id.button);

    MyRelativeLayout parent = findViewById(R.id.parent);

    mMyButton = findViewById(R.id.mybtn);

    button.setOnTouchListener(this);
    parent.setOnTouchListener(this);

    button.setOnClickListener(this);
    parent.setOnClickListener(this);



    mMyButton.setOnTouchListener(this);
    mMyButton.setOnClickListener(this);

}

@Override
public boolean onTouch(View v, MotionEvent event) {

    Log.d("123", "onTouch,View" + v + ",Action:" + event.getAction());

    return false;
}

@Override
public void onClick(View v) {
    Log.d("123", "onClick,View" + v);
}

}

點(diǎn)擊mybutton運(yùn)行打印結(jié)果:


image.png

結(jié)論:父容器先拿到down事件分別調(diào)用dispatchTouchEvent向下分發(fā),onInterceptTouchEvent攔截事件此時(shí)不攔截,向子view(MyButton)分發(fā)down事件,MyButton獲取down事件調(diào)用onTouch,再調(diào)onTouchEvent方法響應(yīng)down事件.當(dāng)松開手指父容器先獲取up事件,執(zhí)行順序跟down事件一樣,如果MyButton設(shè)置了點(diǎn)擊事件會調(diào)用onClick

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末峰鄙,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子太雨,更是在濱河造成了極大的恐慌吟榴,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,602評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件囊扳,死亡現(xiàn)場離奇詭異吩翻,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)锥咸,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,442評論 2 382
  • 文/潘曉璐 我一進(jìn)店門狭瞎,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人搏予,你說我怎么就攤上這事熊锭。” “怎么了缔刹?”我有些...
    開封第一講書人閱讀 152,878評論 0 344
  • 文/不壞的土叔 我叫張陵球涛,是天一觀的道長劣针。 經(jīng)常有香客問我校镐,道長,這世上最難降的妖魔是什么捺典? 我笑而不...
    開封第一講書人閱讀 55,306評論 1 279
  • 正文 為了忘掉前任鸟廓,我火速辦了婚禮,結(jié)果婚禮上襟己,老公的妹妹穿的比我還像新娘引谜。我一直安慰自己,他們只是感情好擎浴,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,330評論 5 373
  • 文/花漫 我一把揭開白布员咽。 她就那樣靜靜地躺著,像睡著了一般贮预。 火紅的嫁衣襯著肌膚如雪贝室。 梳的紋絲不亂的頭發(fā)上契讲,一...
    開封第一講書人閱讀 49,071評論 1 285
  • 那天,我揣著相機(jī)與錄音滑频,去河邊找鬼捡偏。 笑死,一個(gè)胖子當(dāng)著我的面吹牛峡迷,可吹牛的內(nèi)容都是我干的银伟。 我是一名探鬼主播,決...
    沈念sama閱讀 38,382評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼绘搞,長吁一口氣:“原來是場噩夢啊……” “哼彤避!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起夯辖,我...
    開封第一講書人閱讀 37,006評論 0 259
  • 序言:老撾萬榮一對情侶失蹤忠藤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后楼雹,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體模孩,經(jīng)...
    沈念sama閱讀 43,512評論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,965評論 2 325
  • 正文 我和宋清朗相戀三年贮缅,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了榨咐。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,094評論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡谴供,死狀恐怖块茁,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情桂肌,我是刑警寧澤数焊,帶...
    沈念sama閱讀 33,732評論 4 323
  • 正文 年R本政府宣布,位于F島的核電站崎场,受9級特大地震影響佩耳,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜谭跨,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,283評論 3 307
  • 文/蒙蒙 一干厚、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧螃宙,春花似錦蛮瞄、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,286評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至堂湖,卻和暖如春闲先,著一層夾襖步出監(jiān)牢的瞬間周瞎,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,512評論 1 262
  • 我被黑心中介騙來泰國打工饵蒂, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留声诸,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 45,536評論 2 354
  • 正文 我出身青樓退盯,卻偏偏與公主長得像彼乌,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子渊迁,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,828評論 2 345

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