AndroidにおけるOnTouch事件の研究
Androidでは、View Groupにコンポーネントが含まれている場合、このコンポーネントをクリックしてonTouchイベントを傍受すると、親コンポーネント応答なのか、サブコンポーネント応答なのか.ばかはネット上で1篇の関連する招待状を探し当てて、例によって1回テストして、ネット上のあの少し問題があることを発見して、先にテストの結果を総括して以下のようにします.
OnTouchイベントがトリガーされると、AndroidのGroupViewは次の3つの関数を呼び出します.
public boolean dispatchTouchEvent(MotionEvent ev)イベントの配布用
public boolean onInterceptTouchEvent(MotionEvent ev)イベントのブロックに使用
public boolean onTouchEvent(MotionEvent ev)処理イベント
もちろん、LinearLayoutから継承されたクラスなどのコンテナクラスでこの3つの方法を書き換えることができます.一方、Viewクラスを継承するサブクラスは、dispatchとonTouchEventの2つのメソッドしか書き換えられません.クリックすると、この3つの方法が相次いで実行されます.
自分でTextViewサブクラスMyTextViewとLinearLayoutサブクラスMyLinearLayoutを書きました.TextViewはLinearLayoutに含まれています.
MyTextViewをクリックすると、LinearLayoutのdispatchTouchEventにプログラムが入ります.このクラスはsuperを呼び出す必要があります.dispatchTouchEvent(ev); いいえ、後ろの2つの方法ではトリガーできません.だから、フレームワークがsuperにあるので、この方法を書き直す必要はありません.dispatchTouchEvent(ev);でonInterceptTouchEventメソッドとonTouchEventメソッドを呼び出すので、この2つのメソッドをフレームワークにトリガーしたくない場合を除き、手動でdispatchTouchEventの戻り値を設定することは無効です.
dispathTouchEventを実行するとonInterceptionメソッドが実行され、trueに戻るとMyLinearLayoutがこのTouchイベントをブロックすると、独自のOntouchメソッドが実行されることを示します.falseの場合はブロックされないことを示し、このイベントはイベントを渡すサブコントロールMyTextViewに配布されます.
イベントがMyTextViewに渡されると、dispatchTouchEventが実行され、onTouchEventが実行されます.MyTextViewに立ちはだかるonTouchEventがfalseに戻ると、onTouchEventのイベントを実行した後、イベントはMyLinearLaytoutに再配布され、LinearLayoutのonTouchEventが実行されます.
主なコードは次のとおりです.
?[Copy to clipboard]
Download zuiniuwang.java
?[Copy to clipboard]
Download zuiniuwang.xml
本文は“最も牛のばかなブログ”のブログから出て、転載して作者と連絡してください!
OnTouchイベントがトリガーされると、AndroidのGroupViewは次の3つの関数を呼び出します.
public boolean dispatchTouchEvent(MotionEvent ev)イベントの配布用
public boolean onInterceptTouchEvent(MotionEvent ev)イベントのブロックに使用
public boolean onTouchEvent(MotionEvent ev)処理イベント
もちろん、LinearLayoutから継承されたクラスなどのコンテナクラスでこの3つの方法を書き換えることができます.一方、Viewクラスを継承するサブクラスは、dispatchとonTouchEventの2つのメソッドしか書き換えられません.クリックすると、この3つの方法が相次いで実行されます.
自分でTextViewサブクラスMyTextViewとLinearLayoutサブクラスMyLinearLayoutを書きました.TextViewはLinearLayoutに含まれています.
MyTextViewをクリックすると、LinearLayoutのdispatchTouchEventにプログラムが入ります.このクラスはsuperを呼び出す必要があります.dispatchTouchEvent(ev); いいえ、後ろの2つの方法ではトリガーできません.だから、フレームワークがsuperにあるので、この方法を書き直す必要はありません.dispatchTouchEvent(ev);でonInterceptTouchEventメソッドとonTouchEventメソッドを呼び出すので、この2つのメソッドをフレームワークにトリガーしたくない場合を除き、手動でdispatchTouchEventの戻り値を設定することは無効です.
dispathTouchEventを実行するとonInterceptionメソッドが実行され、trueに戻るとMyLinearLayoutがこのTouchイベントをブロックすると、独自のOntouchメソッドが実行されることを示します.falseの場合はブロックされないことを示し、このイベントはイベントを渡すサブコントロールMyTextViewに配布されます.
イベントがMyTextViewに渡されると、dispatchTouchEventが実行され、onTouchEventが実行されます.MyTextViewに立ちはだかるonTouchEventがfalseに戻ると、onTouchEventのイベントを実行した後、イベントはMyLinearLaytoutに再配布され、LinearLayoutのonTouchEventが実行されます.
主なコードは次のとおりです.
?[Copy to clipboard]
Download zuiniuwang.java
- /**
- * MyLinearLayout.java
- * com.androidtest.touch.test
- *
- * Function: TODO
- *
- * ver date author
- * ──────────────────────────────────
- * 2011-5-24 Leon
- *
- * Copyright (c) 2011, TNT All Rights Reserved.
- */
-
- package com.androidtest.touch.test;
-
- import android.content.Context;
- import android.util.AttributeSet;
- import android.util.Log;
- import android.view.MotionEvent;
- import android.widget.LinearLayout;
-
- /**
- * ClassName:MyLinearLayout Function: TODO ADD FUNCTION Reason: TODO ADD REASON
- *
- * @author Leon
- * @version
- * @since Ver 1.1
- * @Date 2011-5-24
- */
- public class MyLinearLayout extends LinearLayout {
- private final static String TAG = MyLinearLayout.class.getSimpleName();
- public MyLinearLayout(Context context, AttributeSet attrs) {
-
- super(context, attrs);
- // TODO Auto-generated constructor stub
- Log.v(TAG , TAG);
-
- }
-
- @Override
- public boolean dispatchTouchEvent(MotionEvent ev) {
- int action = ev.getAction();
-
- switch (action) {
-
- case MotionEvent.ACTION_DOWN:
-
- Log.d(TAG, "dispatchTouchEvent action:ACTION_DOWN");
-
- break;
-
- case MotionEvent.ACTION_MOVE:
-
- Log.d(TAG, "dispatchTouchEvent action:ACTION_MOVE");
-
- break;
-
- case MotionEvent.ACTION_UP:
-
- Log.d(TAG, "dispatchTouchEvent action:ACTION_UP");
-
- break;
-
- case MotionEvent.ACTION_CANCEL:
-
- Log.d(TAG, "dispatchTouchEvent action:ACTION_CANCEL");
-
- break;
-
- }
- // Log.v(TAG , "dispatchTouchEvent "+super.dispatchTouchEvent(ev));
- super.dispatchTouchEvent(ev);
- Log.v(TAG , "dispatchTouchEvent "+ "test.................");
- return true;
- }
-
- @Override
- public boolean onInterceptTouchEvent(MotionEvent ev) {
-
- int action = ev.getAction();
-
- switch (action) {
-
- case MotionEvent.ACTION_DOWN:
-
- Log.d(TAG, "onInterceptTouchEvent action:ACTION_DOWN");
-
- break;
-
- case MotionEvent.ACTION_MOVE:
-
- Log.d(TAG, "onInterceptTouchEvent action:ACTION_MOVE");
-
- break;
-
- case MotionEvent.ACTION_UP:
-
- Log.d(TAG, "onInterceptTouchEvent action:ACTION_UP");
-
- break;
-
- case MotionEvent.ACTION_CANCEL:
-
- Log.d(TAG, "onInterceptTouchEvent action:ACTION_CANCEL");
-
- break;
-
- }
-
- return false;
-
- }
-
- @Override
- public boolean onTouchEvent(MotionEvent ev) {
-
- int action = ev.getAction();
-
- switch (action) {
-
- case MotionEvent.ACTION_DOWN:
-
- Log.d(TAG, "---onTouchEvent action:ACTION_DOWN");
-
- break;
-
- case MotionEvent.ACTION_MOVE:
-
- Log.d(TAG, "---onTouchEvent action:ACTION_MOVE");
-
- break;
-
- case MotionEvent.ACTION_UP:
-
- Log.d(TAG, "---onTouchEvent action:ACTION_UP");
-
- break;
-
- case MotionEvent.ACTION_CANCEL:
-
- Log.d(TAG, "---onTouchEvent action:ACTION_CANCEL");
-
- break;
-
- }
-
- return true;
- }
-
- }
-
- /**
- * MyTestView.java
- * com.androidtest.touch.test
- *
- * Function: TODO
- *
- * ver date author
- * ──────────────────────────────────
- * 2011-5-24 Leon
- *
- * Copyright (c) 2011, TNT All Rights Reserved.
- */
-
- package com.androidtest.touch.test;
-
- import android.content.Context;
- import android.util.AttributeSet;
- import android.util.Log;
- import android.view.MotionEvent;
- import android.widget.TextView;
-
- /**
- * ClassName:MyTestView Function: TODO ADD FUNCTION Reason: TODO ADD REASON
- *
- * @author Leon
- * @version
- * @since Ver 1.1
- * @Date 2011-5-24
- */
- public class MyTestView extends TextView {
-
- public static final String TAG = MyTestView.class.getSimpleName();
-
- public MyTestView(Context context, AttributeSet attrs) {
-
- super(context, attrs);
- // TODO Auto-generated constructor stub
- Log.v(TAG, TAG);
-
- }
-
- @Override
- public boolean dispatchTouchEvent(MotionEvent ev) {
- int action = ev.getAction();
-
- switch (action) {
-
- case MotionEvent.ACTION_DOWN:
-
- Log.d(TAG, "dispatchTouchEvent action:ACTION_DOWN");
-
- break;
-
- case MotionEvent.ACTION_MOVE:
-
- Log.d(TAG, "dispatchTouchEvent action:ACTION_MOVE");
-
- break;
-
- case MotionEvent.ACTION_UP:
-
- Log.d(TAG, "dispatchTouchEvent action:ACTION_UP");
-
- break;
-
- case MotionEvent.ACTION_CANCEL:
-
- Log.d(TAG, "onTouchEvent action:ACTION_CANCEL");
-
- break;
-
- }
- return super.dispatchTouchEvent(ev);
- }
-
- @Override
- public boolean onTouchEvent(MotionEvent ev) {
-
- int action = ev.getAction();
-
- switch (action) {
-
- case MotionEvent.ACTION_DOWN:
-
- Log.d(TAG, "---onTouchEvent action:ACTION_DOWN");
-
- break;
-
- case MotionEvent.ACTION_MOVE:
-
- Log.d(TAG, "---onTouchEvent action:ACTION_MOVE");
-
- break;
-
- case MotionEvent.ACTION_UP:
-
- Log.d(TAG, "---onTouchEvent action:ACTION_UP");
-
- break;
-
- case MotionEvent.ACTION_CANCEL:
-
- Log.d(TAG, "---onTouchEvent action:ACTION_CANCEL");
-
- break;
-
- }
- return false;
-
- }
-
- }
- /**
- * TestTouchEvent.java
- * com.androidtest.touch.test
- *
- * Function: TODO
- *
- * ver date author
- * ──────────────────────────────────
- * 2011-5-24 Leon
- *
- * Copyright (c) 2011, TNT All Rights Reserved.
- */
-
- package com.androidtest.touch.test;
-
- import com.androidtest.R;
-
- import android.app.Activity;
- import android.os.Bundle;
-
- /**
- * ClassName:TestTouchEvent
- * Function: TODO ADD FUNCTION
- * Reason: TODO ADD REASON
- *
- * @author Leon
- * @version
- * @since Ver 1.1
- * @Date 2011-5-24
- */
- public class TestTouchEvent extends Activity{
-
- @Override
- protected void onCreate(Bundle savedInstanceState) {
-
- // TODO Auto-generated method stub
- super.onCreate(savedInstanceState);
- this.setContentView(R.layout.test_touch_event);
-
- }
-
- }
?[Copy to clipboard]
Download zuiniuwang.xml
- <?xml version="1.0" encoding="utf-8"?>
- <com.androidtest.touch.test.mylinearlayout android:gravity="center" android:layout_height="fill_parent" android:layout_width="fill_parent" android:orientation="vertical" xmlns:android="http://schemas.android.com/apk/res/android">
- <com.androidtest.touch.test.mytestview android:background="#FFFFFF" android:id="@+id/tv" android:layout_height="200px" android:layout_width="200px" android:text="leon" android:textcolor="#0000FF" android:textsize="40sp" android:textstyle="bold">
- </com.androidtest.touch.test.mytestview></com.androidtest.touch.test.mylinearlayout>
本文は“最も牛のばかなブログ”のブログから出て、転載して作者と連絡してください!