简单理解:Activity、ViewGroup(LinearLayout,RelativeLayout…),View(Button,TextView…)
Activity :老板
ViewGroup:组长
View:程序员小王
Activity如下
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35
| public class MainActivity extends AppCompatActivity implements View.OnClickListener {
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main);
findViewById(R.id.touchView).setOnClickListener(this); findViewById(R.id.btn).setOnClickListener(this); }
@Override public void onClick(View v) { switch (v.getId()) { case R.id.touchView: Log.i("ddms", "onClick: 点击了空白"); break; case R.id.btn: Log.i("ddms", "onClick: 点击了按钮"); break; } }
@Override public boolean dispatchTouchEvent(MotionEvent ev) { Log.i("ddms", "dispatchTouchEvent:老板: 我要增加功能"); return super.dispatchTouchEvent(ev); }
@Override public boolean onTouchEvent(MotionEvent event) { Log.i("ddms", "onTouchEvent:老板: 太复杂,简化下"); return super.onTouchEvent(event); } }
|
XML 如下
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| <?xml version="1.0" encoding="utf-8"?> <android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent">
<com.example.bxlt.myapplication.TouchViewGroup android:id="@+id/touchView" android:layout_width="match_parent" android:layout_height="match_parent">
<com.example.bxlt.myapplication.TouchButton android:id="@+id/btn" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="btn" /> </com.example.bxlt.myapplication.TouchViewGroup> </android.support.constraint.ConstraintLayout>
|
ViewGroup如下
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
| public class TouchViewGroup extends RelativeLayout {
public TouchViewGroup(Context context, @Nullable AttributeSet attrs) { super(context, attrs); }
@Override public boolean dispatchTouchEvent(MotionEvent ev) { Log.i("ddms", "dispatchTouchEvent:组长: 老大要加功能"); return super.dispatchTouchEvent(ev); }
@Override public boolean onInterceptTouchEvent(MotionEvent ev) { Log.i("ddms", "onInterceptTouchEvent: 组长: 先问问小王"); return super.onInterceptTouchEvent(ev); }
@Override public boolean onTouchEvent(MotionEvent event) { boolean b = super.onTouchEvent(event); Log.i("ddms", "onTouchEvent:组长: 小王说搞不了,自己搞?" + b); return b; } }
|
VIew如下
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| public class TouchButton extends Button {
public TouchButton(Context context, AttributeSet attrs) { super(context, attrs); }
@Override public boolean dispatchTouchEvent(MotionEvent event) { Log.i("ddms", "dispatchTouchEvent:小王: 要加功能?"); return super.dispatchTouchEvent(event); }
@Override public boolean onTouchEvent(MotionEvent event) { boolean b = super.onTouchEvent(event); Log.i("ddms", "onTouchEvent:小王: 能搞?" + b); return b; } }
|
点击按钮(为什么两遍Log?因为down 和up 各一遍)

改成小王不干,onTouchEvent返回false


说明:View的onTouchEvent返回false,ViewGroup的onTouchEvent 开始执行。另外最后的log是点击了空白,说明btn的点击事件已失效
改成组长也不干,onTouchEvent返回false


说明:老板下次下发任务,直接无效应。最后的log没有了,说明ViewGroup点击事件也失效了
大神文章:http://wuxiaolong.me/2015/12/19/MotionEvent/