AndroidにおけるViewとView Groupによるtouchイベントオブジェクトの処理方法

3991 ワード

イベント伝達に対するViewonTouchEventメソッドの戻り値の影響
ButtonのサブクラスMyButtonを例に説明すると、onTouchEvent関数の戻り値と出力を変更することでコードの実行を判断し、MyButtonコードは以下のようになる
package com.android.activity;
import android.content.Context;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.widget.Button;
public class MyButton extends Button{
	public MyButton(Context context) {
		super(context);		
	}	
	 public MyButton(Context context, AttributeSet attrs) {
	 	super(context,attrs);
	 }
	public MyButton(Context context,AttributeSet attrs,int defStyle) {
			super(context, attrs, defStyle);	
	}
	@Override
	public boolean onTouchEvent(MotionEvent event) {
		//super.onTouchEvent(event);
		System.out.println(1111);
		return true;
	}
}

レイアウトファイル
<LinearLayout 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"
    android:orientation="vertical"
    tools:context=".MyTextActivity" >

    <com.android.activity.MyButton
        android:id="@+id/myTextView"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:text="@string/hello_world" />

</LinearLayout>

マウスダウンからupの完了を完全なイベントとし、移動イベントなどを含む可能性があります.
完全なtouchイベントに次のようなサブイベントが含まれている場合
down --- move --- up 
ButtonのonTouchEventメソッドを書き換えます.メソッドがtrueを返すと、down、move、upの3つのイベントを含むイベントオブジェクトはコントロールのonTouchEventメソッドに渡されますが、メソッドがfalseを返すと、コントロールはdownイベントのイベントオブジェクトのみを受け取り、moveとupのイベントオブジェクトは受け取りません.これがonTouchEventイベントでtrueとfalseを返す違いです
ViewGroupのonInterceptTouchEvent戻り値がtouchイベント伝達に与える影響
onInterceptTouchEventの戻り値には2つのtrueとfalseがあります
trueを返す場合
戻り値がtrueの場合、ViewGroupの下にあるすべてのViewコントロールはtouchイベントを受信せず、イベントオブジェクトはViewGroupのonTouchEvent関数にのみ渡されます.
falseを返す
falseを返すとtouchイベントオブジェクトはまずこの関数に渡され,その後target's onTouchEventオブジェクトに渡され,実験結果からこのような結論が得られた.
MyLinearLayoutがLinearLayout(LinearLayoutはView Groupに属する)を継承していると仮定すると、MyLinearLayoutコードは次のようになります.
package com.android.activity;

import android.content.Context;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.widget.LinearLayout;

public class MyLinearLayout extends LinearLayout{

	public MyLinearLayout(Context context) {
		super(context);
		// TODO Auto-generated constructor stub
	}
	 public MyLinearLayout(Context context, AttributeSet attrs) {
	        super(context, attrs);
	
	 }
	@Override
	public boolean onInterceptTouchEvent(MotionEvent ev) {
		// TODO Auto-generated method stub
		System.out.println("Intercept");
		return false;
	}
	@Override
	public boolean onTouchEvent(MotionEvent event) {
		System.out.println("Intercept onTouch");
		return true;
	}	
}

レイアウトファイル、
<com.android.activity.MyLinearLayout 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"
    android:orientation="vertical"
    tools:context=".MyTextActivity" >

    <com.android.activity.MyButton
        android:id="@+id/myTextView"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:text="@string/hello_world" />

</com.android.activity.MyLinearLayout>

onInterceptTouchEventメソッドを書き換えてfalseを返します.
レイアウトファイルでレイアウトを参照し、レイアウトにMyButtonコントロールを追加
では、Buttonをクリックすると、touchイベントはonInterceptTouchEventに渡され、MybuttonのonTouchEventメソッドに渡され、MyLinearLayoutのonTouchEventメソッドには渡されず、MyButton以外の空白領域をクリックすると、touchイベントはMyLinearLayoutのonInterceptTouchEventメソッドに渡され、MyLinearLayoutのonTouchEventメソッドに渡されます.