天天看點

驗證Android事件傳遞機制(dispatchTouchEvent、onInterceptTouchEvent、onTouchEvent)一、代碼二、日志結果

http://blog.csdn.net/yanzi1225627/article/details/22592831

看過這篇微網誌之後,好像他貼的ViewGroup那部分日志結果有點問題,為了确定結果如何,決定自己驗證一下,也友善以後自己再檢視,下面貼上驗證的代碼。

郭霖的兩篇講解的超級清楚的Android事件分發機制,更加深刻地了解了

http://blog.csdn.net/guolin_blog/article/details/9097463

http://blog.csdn.net/guolin_blog/article/details/9153747

一、代碼

1.MainActivity.java

public class MainActivity extends AppCompatActivity {
    @Bind(R.id.testLinearLayout)
    TestLinearLayout testLinearLayout;
    @Bind(R.id.testButton)
    TestButton testButton;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        ButterKnife.bind(this);
        testLinearLayout.setOnTouchListener(new View.OnTouchListener() {
            @Override
            public boolean onTouch(View v, MotionEvent event) {
                switch (event.getActionMasked()) {
                    case MotionEvent.ACTION_DOWN:
                        Log.d(Util.captain, "TestLinearLayout-onTouch-ACTION_DOWN");
                        break;
                    case MotionEvent.ACTION_UP:
                        Log.d(Util.captain, "TestLinearLayout-onTouch-ACTION_UP");
                        break;
                    default:
                        break;
                }
                return false;
            }
        });
        testLinearLayout.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Log.d(Util.captain, "TestLinearLayout-onClick");
            }
        });
        testButton.setOnTouchListener(new View.OnTouchListener() {
            @Override
            public boolean onTouch(View v, MotionEvent event) {
                switch (event.getActionMasked()) {
                    case MotionEvent.ACTION_DOWN:
                        Log.d(Util.captain, "TestButton-onTouch-ACTION_DOWN");
                        break;
                    case MotionEvent.ACTION_UP:
                        Log.d(Util.captain, "TestButton-onTouch-ACTION_UP");
                        break;
                    default:
                        break;
                }
                return false;
            }
        });
        testButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Log.d(Util.captain, "TestButton-onClick");
            }
        });
    }

    @Override
    public boolean dispatchTouchEvent(MotionEvent event) {
        switch (event.getActionMasked()) {
            case MotionEvent.ACTION_DOWN:
                Log.d(Util.captain, "MainActivity-dispatchTouchEvent-ACTION_DOWN");
                break;
            case MotionEvent.ACTION_UP:
                Log.d(Util.captain, "MainActivity-dispatchTouchEvent-ACTION_UP");
                break;
            default:
                break;
        }
        return super.dispatchTouchEvent(event);
    }

    @Override
    public boolean onTouchEvent(MotionEvent event) {
        switch (event.getActionMasked()) {
            case MotionEvent.ACTION_DOWN:
                Log.d(Util.captain, "MainActivity-onTouchEvent-ACTION_DOWN");
                break;
            case MotionEvent.ACTION_UP:
                Log.d(Util.captain, "MainActivity-onTouchEvent-ACTION_UP");
                break;
            default:
                break;
        }
        return super.onTouchEvent(event);
    }

}      

2.MainActivity.xml

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="com.edward.touchtest.MainActivity">

    <com.edward.touchtest.TestLinearLayout
        android:id="@+id/testLinearLayout"
        android:layout_width="match_parent"
        android:layout_height="match_parent">

        <com.edward.touchtest.TestButton
            android:id="@+id/testButton"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="TestButton" />
    </com.edward.touchtest.TestLinearLayout>
</RelativeLayout>      

3.TestLinearLayout.java

public class TestLinearLayout extends LinearLayout {
    public TestLinearLayout(Context context, AttributeSet attrs) {
        super(context, attrs);
        // TODO Auto-generated constructor stub
    }

    @Override
    public boolean dispatchTouchEvent(MotionEvent event) {
        switch (event.getActionMasked()) {
            case MotionEvent.ACTION_DOWN:
                Log.d(Util.captain, "TestLinearLayout-dispatchTouchEvent-ACTION_DOWN");
                break;
            case MotionEvent.ACTION_UP:
                Log.d(Util.captain, "TestLinearLayout-dispatchTouchEvent-ACTION_UP");
                break;
            default:
                break;
        }
        return super.dispatchTouchEvent(event);
    }

    @Override
    public boolean onInterceptTouchEvent(MotionEvent event) {
        switch (event.getActionMasked()) {
            case MotionEvent.ACTION_DOWN:
                Log.d(Util.captain, "TestLinearLayout-onInterceptTouchEvent-ACTION_DOWN");
                break;
            case MotionEvent.ACTION_UP:
                Log.d(Util.captain, "TestLinearLayout-onInterceptTouchEvent-ACTION_UP");
                break;
            default:
                break;
        }
        return super.onInterceptTouchEvent(event);
    }

    @Override
    public boolean onTouchEvent(MotionEvent event) {
        switch (event.getActionMasked()) {
            case MotionEvent.ACTION_DOWN:
                Log.d(Util.captain, "TestLinearLayout-onTouchEvent-ACTION_DOWN");
                break;
            case MotionEvent.ACTION_UP:
                Log.d(Util.captain, "TestLinearLayout-onTouchEvent-ACTION_UP");
                break;
            default:
                break;
        }
        return super.onTouchEvent(event);
    }
}      

4.TestButton.java

public class TestButton extends Button {

    public TestButton(Context context, AttributeSet attrs) {
        super(context, attrs);
        // TODO Auto-generated constructor stub
    }

    @Override
    public boolean dispatchTouchEvent(MotionEvent event) {
        switch (event.getActionMasked()) {
            case MotionEvent.ACTION_DOWN:
                Log.d(Util.captain, "TestButton-dispatchTouchEvent-ACTION_DOWN");
                break;
            case MotionEvent.ACTION_UP:
                Log.d(Util.captain, "TestButton-dispatchTouchEvent-ACTION_UP");
                break;
            default:
                break;
        }
        return super.dispatchTouchEvent(event);
    }

    @Override
    public boolean onTouchEvent(MotionEvent event) {
        switch (event.getActionMasked()) {
            case MotionEvent.ACTION_DOWN:
                Log.d(Util.captain, "TestButton-onTouchEvent-ACTION_DOWN");
                break;
            case MotionEvent.ACTION_UP:
                Log.d(Util.captain, "TestButton-onTouchEvent-ACTION_UP");
                break;
            default:
                break;
        }
        return super.onTouchEvent(event);
    }
}      

二、日志結果

1、一次點選事件

01-06 15:17:05.297 30986-30986/com.edward.touchtest D/captain: MainActivity-dispatchTouchEvent-ACTION_DOWN

01-06 15:17:05.297 30986-30986/com.edward.touchtest D/captain: TestLinearLayout-dispatchTouchEvent-ACTION_DOWN

01-06 15:17:05.297 30986-30986/com.edward.touchtest D/captain: TestLinearLayout-onInterceptTouchEvent-ACTION_DOWN

01-06 15:17:05.297 30986-30986/com.edward.touchtest D/captain: TestButton-dispatchTouchEvent-ACTION_DOWN

01-06 15:17:05.297 30986-30986/com.edward.touchtest D/captain: TestButton-onTouch-ACTION_DOWN

01-06 15:17:05.297 30986-30986/com.edward.touchtest D/captain: TestButton-onTouchEvent-ACTION_DOWN

01-06 15:17:06.288 30986-30986/com.edward.touchtest D/captain: MainActivity-dispatchTouchEvent-ACTION_UP

01-06 15:17:06.288 30986-30986/com.edward.touchtest D/captain: TestLinearLayout-dispatchTouchEvent-ACTION_UP

01-06 15:17:06.288 30986-30986/com.edward.touchtest D/captain: TestLinearLayout-onInterceptTouchEvent-ACTION_UP

01-06 15:17:06.288 30986-30986/com.edward.touchtest D/captain: TestButton-dispatchTouchEvent-ACTION_UP

01-06 15:17:06.288 30986-30986/com.edward.touchtest D/captain: TestButton-onTouch-ACTION_UP

01-06 15:17:06.298 30986-30986/com.edward.touchtest D/captain: TestButton-onTouchEvent-ACTION_UP

01-06 15:17:06.298 30986-30986/com.edward.touchtest D/captain: TestButton-onClick

2、注釋掉button的OnTouchListener和OnClickListener,再點選一次

01-06 15:43:34.327 10158-10158/com.edward.touchtest D/captain: MainActivity-dispatchTouchEvent-ACTION_DOWN

01-06 15:43:34.327 10158-10158/com.edward.touchtest D/captain: TestLinearLayout-dispatchTouchEvent-ACTION_DOWN

01-06 15:43:34.327 10158-10158/com.edward.touchtest D/captain: TestLinearLayout-onInterceptTouchEvent-ACTION_DOWN

01-06 15:43:34.327 10158-10158/com.edward.touchtest D/captain: TestButton-dispatchTouchEvent-ACTION_DOWN

01-06 15:43:34.327 10158-10158/com.edward.touchtest D/captain: TestButton-onTouchEvent-ACTION_DOWN

01-06 15:43:34.447 10158-10158/com.edward.touchtest D/captain: MainActivity-dispatchTouchEvent-ACTION_UP

01-06 15:43:34.447 10158-10158/com.edward.touchtest D/captain: TestLinearLayout-dispatchTouchEvent-ACTION_UP

01-06 15:43:34.447 10158-10158/com.edward.touchtest D/captain: TestLinearLayout-onInterceptTouchEvent-ACTION_UP

01-06 15:43:34.447 10158-10158/com.edward.touchtest D/captain: TestButton-dispatchTouchEvent-ACTION_UP

01-06 15:43:34.447 10158-10158/com.edward.touchtest D/captain: TestButton-onTouchEvent-ACTION_UP

3、将TestLinearlayout的onInterceptTouchEvent 改成return true,不讓孩子知道。

01-06 15:53:04.994 4918-4918/com.edward.touchtest D/captain: MainActivity-dispatchTouchEvent-ACTION_DOWN

01-06 15:53:04.994 4918-4918/com.edward.touchtest D/captain: TestLinearLayout-dispatchTouchEvent-ACTION_DOWN

01-06 15:53:04.994 4918-4918/com.edward.touchtest D/captain: TestLinearLayout-onInterceptTouchEvent-ACTION_DOWN

01-06 15:53:04.994 4918-4918/com.edward.touchtest D/captain: TestLinearLayout-onTouch-ACTION_DOWN

01-06 15:53:04.994 4918-4918/com.edward.touchtest D/captain: TestLinearLayout-onTouchEvent-ACTION_DOWN

01-06 15:53:05.064 4918-4918/com.edward.touchtest D/captain: MainActivity-dispatchTouchEvent-ACTION_UP

01-06 15:53:05.064 4918-4918/com.edward.touchtest D/captain: TestLinearLayout-dispatchTouchEvent-ACTION_UP

01-06 15:53:05.074 4918-4918/com.edward.touchtest D/captain: TestLinearLayout-onTouch-ACTION_UP

01-06 15:53:05.074 4918-4918/com.edward.touchtest D/captain: TestLinearLayout-onTouchEvent-ACTION_UP

01-06 15:53:05.074 4918-4918/com.edward.touchtest D/captain: TestLinearLayout-onClick