Android触摸事件的分发机制

来源:互联网 发布:matlab生成随机数矩阵 编辑:程序博客网 时间:2024/05/18 16:13
---恢复内容开始---

一、MotionEvent : ACTION_DOWN(下按事件)、ACTION_UP(松开事件)、ACTION_MOVE(移动事件)

 

二、三大函数

1.dispatchTouchEvent(Event event) == > 分发函数,由系统自动调用(返回值为true时,viewGroup可以向其子控件分发事件,view则分发给自身)

public boolean dispatchTouchEvent(MotionEvent ev) {
        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:

 1 package com.example.qjm3662.myapplication;
 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:

 1 package com.example.qjm3662.myapplication;
 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:

 1 package com.example.qjm3662.myapplication;
 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:

 

 1 package com.example.qjm3662.myapplication;
 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:

 1 package com.example.qjm3662.myapplication;
 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 } 

 

 布局:

<?xml version="1.0" encoding="utf-8"?>
<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: dispatchTouchEvent-->ACTION_DOWN
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: dispatchTouchEvent-->ACTION_DOWN
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 

 

0 0
原创粉丝点击