---恢复内容开始---
一、MotionEvent : ACTION_DOWN(下按事件)、ACTION_UP(松开事件)、ACTION_MOVE(移动事件)
二、三大函数
1.dispatchTouchEvent(Event event) == > 分发函数,由系统自动调用(返回值为true时,viewGroup可以向其子控件分发事件,view则分发给自身)
int action = ev.getAction();
switch(action){
case MotionEvent.ACTION_DOWN:
Log.e("MyLinearLayout2", "dispatchTouchEvent-->ACTION_DOWN");
break;
case MotionEvent.ACTION_MOVE:
Log.e("MyLinearLayout2","dispatchTouchEvent-->ACTION_MOVE");
break;
case MotionEvent.ACTION_UP:
Log.e("MyLinearLayout2","dispatchTouchEvent-->ACTION_UP");
break;
}
return super.dispatchTouchEvent(ev);
}
2.onInterceptTouchEvent(Event event) ==> 拦截函数(viewGroup有,view没有)
a.返回值为true时,viewGroup对象会将事件拦截,使得之后的UP和MOVE不会被任何控件相应;
b.返回值为false时,viewGroup不拦截事件,事件可以正常分发。
public boolean onInterceptTouchEvent(MotionEvent ev) {
int action = ev.getAction();
switch(action){
case MotionEvent.ACTION_DOWN:
Log.e("MyLInearLayout","onInterceptTouchEvent-->ACTION_DOWN");
break;
case MotionEvent.ACTION_MOVE:
Log.e("MyLInearLayout","onInterceptTouchEvent-->ACTION_MOVE");
break;
case MotionEvent.ACTION_UP:
Log.e("MyLInearLayout","onInterceptTouchEvent-->ACTION_UP");
break;
}
return false;
}
3.onTouchEvent(Event event) == >触摸相应函数
a.事件逐级向下传递,直到某个view或viewGroup执行onTouchEvent,若返回值为false,则会通知其父viewGroup执行onTouchEvent,若返回值为true,则不通知其父viewGroup执行onTouchEvent;
b.当某个view或viewGroup的onTouchEvent()相应,并且返回值为true时,之后的MOVE和UP的响应事件都会直接传递给该空间,并由该控件的onTouchEvent()响应;
直接上代码:
MainActivity:
2
3 import android.app.Activity;
4 import android.content.Context;
5 import android.os.Bundle;
6 import android.support.design.widget.FloatingActionButton;
7 import android.support.design.widget.Snackbar;
8 import android.support.v7.app.AppCompatActivity;
9 import android.support.v7.widget.Toolbar;
10 import android.util.AttributeSet;
11 import android.util.Log;
12 import android.view.MotionEvent;
13 import android.view.View;
14 import android.view.Menu;
15 import android.view.MenuItem;
16 import android.widget.LinearLayout;
17
18 public class MainActivity extends Activity{
19
20 @Override
21 protected void onCreate(Bundle savedInstanceState) {
22 super.onCreate(savedInstanceState);
23 setContentView(R.layout.activity_main);
24 }
25 }
MyLInearLayout:
2
3 import android.content.Context;
4 import android.util.AttributeSet;
5 import android.util.Log;
6 import android.view.MotionEvent;
7 import android.widget.LinearLayout;
8
9 /**
10 * Created by qjm3662 on 2016/4/10 0010.
11 */
12 public class MyLInearLayout extends LinearLayout {
13 public MyLInearLayout(Context context, AttributeSet attrs) {
14 super(context, attrs);
15 }
16
17 @Override
18 public boolean dispatchTouchEvent(MotionEvent ev) {
19 int action = ev.getAction();
20 switch(action){
21 case MotionEvent.ACTION_DOWN:
22 Log.e("MyLInearLayout","dispatchTouchEvent-->ACTION_DOWN");
23 break;
24 case MotionEvent.ACTION_MOVE:
25 Log.e("MyLInearLayout","dispatchTouchEvent-->ACTION_MOVE");
26 break;
27 case MotionEvent.ACTION_UP:
28 Log.e("MyLInearLayout","dispatchTouchEvent-->ACTION_UP");
29 break;
30 }
31 return super.dispatchTouchEvent(ev);
32 }
33
34 @Override
35 public boolean onTouchEvent(MotionEvent event) {
36 int action = event.getAction();
37 switch(action){
38 case MotionEvent.ACTION_DOWN:
39 Log.e("MyLInearLayout","onTouchEvent-->ACTION_DOWN");
40 break;
41 case MotionEvent.ACTION_MOVE:
42 Log.e("MyLInearLayout","onTouchEvent-->ACTION_MOVE");
43 break;
44 case MotionEvent.ACTION_UP:
45 Log.e("MyLInearLayout","onTouchEvent-->ACTION_UP");
46 break;
47 }
48 return false;
49 }
50
51 @Override
52 public boolean onInterceptTouchEvent(MotionEvent ev) {
53
54 int action = ev.getAction();
55 switch(action){
56 case MotionEvent.ACTION_DOWN:
57 Log.e("MyLInearLayout","onInterceptTouchEvent-->ACTION_DOWN");
58 break;
59 case MotionEvent.ACTION_MOVE:
60 Log.e("MyLInearLayout","onInterceptTouchEvent-->ACTION_MOVE");
61 break;
62 case MotionEvent.ACTION_UP:
63 Log.e("MyLInearLayout","onInterceptTouchEvent-->ACTION_UP");
64 break;
65 }
66 return false;
67 }
68
69 }
MyLinearLayout2:
2
3 import android.content.Context;
4 import android.util.AttributeSet;
5 import android.util.Log;
6 import android.view.MotionEvent;
7 import android.widget.LinearLayout;
8
9 /**
10 * Created by qjm3662 on 2016/4/10 0010.
11 */
12 public class MyLinearLayout2 extends LinearLayout{
13 public MyLinearLayout2(Context context) {
14 super(context);
15 }
16
17 public MyLinearLayout2(Context context, AttributeSet attrs) {
18 super(context, attrs);
19 }
20
21 public MyLinearLayout2(Context context, AttributeSet attrs, int defStyleAttr) {
22 super(context, attrs, defStyleAttr);
23 }
24
25 @Override
26 public boolean dispatchTouchEvent(MotionEvent ev) {
27 int action = ev.getAction();
28 switch(action){
29 case MotionEvent.ACTION_DOWN:
30 Log.e("MyLinearLayout2", "dispatchTouchEvent-->ACTION_DOWN");
31 break;
32 case MotionEvent.ACTION_MOVE:
33 Log.e("MyLinearLayout2","dispatchTouchEvent-->ACTION_MOVE");
34 break;
35 case MotionEvent.ACTION_UP:
36 Log.e("MyLinearLayout2","dispatchTouchEvent-->ACTION_UP");
37 break;
38 }
39 return super.dispatchTouchEvent(ev);
40 }
41
42 @Override
43 public boolean onTouchEvent(MotionEvent event) {
44 int action = event.getAction();
45 switch(action){
46 case MotionEvent.ACTION_DOWN:
47 Log.e("MyLinearLayout2","onTouchEvent-->ACTION_DOWN");
48 break;
49 case MotionEvent.ACTION_MOVE:
50 Log.e("MyLinearLayout2","onTouchEvent-->ACTION_MOVE");
51 break;
52 case MotionEvent.ACTION_UP:
53 Log.e("MyLinearLayout2","onTouchEvent-->ACTION_UP");
54 break;
55 }
56 return false;
57 }
58
59 @Override
60 public boolean onInterceptTouchEvent(MotionEvent ev) {
61
62 int action = ev.getAction();
63 switch(action){
64 case MotionEvent.ACTION_DOWN:
65 Log.e("MyLinearLayout2","onInterceptTouchEvent-->ACTION_DOWN");
66 break;
67 case MotionEvent.ACTION_MOVE:
68 Log.e("MyLinearLayout2","onInterceptTouchEvent-->ACTION_MOVE");
69 break;
70 case MotionEvent.ACTION_UP:
71 Log.e("MyLinearLayout2","onInterceptTouchEvent-->ACTION_UP");
72 break;
73 }
74 return true;
75 }
76 }
view:
2
3 import android.content.Context;
4 import android.util.AttributeSet;
5 import android.util.Log;
6 import android.view.MotionEvent;
7 import android.widget.TextView;
8
9 /**
10 * Created by qjm3662 on 2016/4/10 0010.
11 */
12 public class view extends TextView{
13
14
15 public view(Context context) {
16 super(context);
17 }
18
19 public view(Context context, AttributeSet attrs) {
20 super(context, attrs);
21 }
22
23 public view(Context context, AttributeSet attrs, int defStyleAttr) {
24 super(context, attrs, defStyleAttr);
25 }
26
27
28 @Override
29 public boolean dispatchTouchEvent(MotionEvent ev) {
30 int action = ev.getAction();
31 switch(action){
32 case MotionEvent.ACTION_DOWN:
33 Log.e("view","dispatchTouchEvent-->ACTION_DOWN");
34 break;
35 case MotionEvent.ACTION_MOVE:
36 Log.e("view","dispatchTouchEvent-->ACTION_MOVE");
37 break;
38 case MotionEvent.ACTION_UP:
39 Log.e("view","dispatchTouchEvent-->ACTION_UP");
40 break;
41 }
42 return super.dispatchTouchEvent(ev);
43 }
44
45 @Override
46 public boolean onTouchEvent(MotionEvent event) {
47 int action = event.getAction();
48 switch(action){
49 case MotionEvent.ACTION_DOWN:
50 Log.e("view","onTouchEvent-->ACTION_DOWN");
51 break;
52 case MotionEvent.ACTION_MOVE:
53 Log.e("view","onTouchEvent-->ACTION_MOVE");
54 break;
55 case MotionEvent.ACTION_UP:
56 Log.e("view","onTouchEvent-->ACTION_UP");
57 break;
58 }
59 return true;
60 }
61
62
63 }
view2:
2
3 import android.content.Context;
4 import android.util.AttributeSet;
5 import android.util.Log;
6 import android.view.MotionEvent;
7 import android.widget.ImageView;
8
9 /**
10 * Created by qjm3662 on 2016/4/10 0010.
11 */
12 public class view2 extends ImageView{
13 public view2(Context context) {
14 super(context);
15 }
16
17 public view2(Context context, AttributeSet attrs) {
18 super(context, attrs);
19 }
20
21 public view2(Context context, AttributeSet attrs, int defStyleAttr) {
22 super(context, attrs, defStyleAttr);
23 }
24
25 @Override
26 public boolean dispatchTouchEvent(MotionEvent event) {
27 int action = event.getAction();
28 switch(action){
29 case MotionEvent.ACTION_DOWN:
30 Log.e("view2", "dispatchTouchEvent-->ACTION_DOWN");
31 break;
32 case MotionEvent.ACTION_MOVE:
33 Log.e("view2","dispatchTouchEvent-->ACTION_MOVE");
34 break;
35 case MotionEvent.ACTION_UP:
36 Log.e("view2","dispatchTouchEvent-->ACTION_UP");
37 break;
38 }
39 return super.dispatchTouchEvent(event);
40 }
41
42 @Override
43 public boolean onTouchEvent(MotionEvent event) {
44 int action = event.getAction();
45 switch(action){
46 case MotionEvent.ACTION_DOWN:
47 Log.e("view2","onTouchEvent-->ACTION_DOWN");
48 break;
49 case MotionEvent.ACTION_MOVE:
50 Log.e("view2","onTouchEvent-->ACTION_MOVE");
51 break;
52 case MotionEvent.ACTION_UP:
53 Log.e("view2","onTouchEvent-->ACTION_UP");
54 break;
55 }
56 return false;
57 }
58 }
布局:
<com.example.qjm3662.myapplication.MyLInearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
xmlns:android="http://schemas.android.com/apk/res/android">
<com.example.qjm3662.myapplication.view
android:text="dsvsdvsvsdv"
android:textSize="24sp"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
<com.example.qjm3662.myapplication.MyLinearLayout2
android:layout_width="50dp"
android:layout_height="50dp"
android:orientation="vertical"
>
<com.example.qjm3662.myapplication.view2
android:src="@drawable/ic_launcher"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
</com.example.qjm3662.myapplication.MyLinearLayout2>
</com.example.qjm3662.myapplication.MyLInearLayout>
运行结果:
点击上面的TextView后松开:
04-10 06:42:32.234 2414-2414/com.example.qjm3662.myapplication E/MyLInearLayout: onInterceptTouchEvent-->ACTION_DOWN
04-10 06:42:32.234 2414-2414/com.example.qjm3662.myapplication E/view: dispatchTouchEvent-->ACTION_DOWN
04-10 06:42:32.234 2414-2414/com.example.qjm3662.myapplication E/view: onTouchEvent-->ACTION_DOWN
04-10 06:42:32.474 2414-2414/com.example.qjm3662.myapplication E/MyLInearLayout: dispatchTouchEvent-->ACTION_UP
04-10 06:42:32.474 2414-2414/com.example.qjm3662.myapplication E/MyLInearLayout: onInterceptTouchEvent-->ACTION_UP
04-10 06:42:32.474 2414-2414/com.example.qjm3662.myapplication E/view: dispatchTouchEvent-->ACTION_UP
04-10 06:42:32.474 2414-2414/com.example.qjm3662.myapplication E/view: onTouchEvent-->ACTION_UP
点击下面的ImagView后松开:
04-10 06:43:58.322 2414-2414/com.example.qjm3662.myapplication E/MyLInearLayout: onInterceptTouchEvent-->ACTION_DOWN
04-10 06:43:58.322 2414-2414/com.example.qjm3662.myapplication E/MyLinearLayout2: dispatchTouchEvent-->ACTION_DOWN
04-10 06:43:58.322 2414-2414/com.example.qjm3662.myapplication E/MyLinearLayout2: onInterceptTouchEvent-->ACTION_DOWN
04-10 06:43:58.322 2414-2414/com.example.qjm3662.myapplication E/MyLinearLayout2: onTouchEvent-->ACTION_DOWN
04-10 06:43:58.322 2414-2414/com.example.qjm3662.myapplication E/MyLInearLayout: onTouchEvent-->ACTION_DOWN