AndroidにおけるViewとView Groupによるtouchイベントオブジェクトの処理方法
3991 ワード
イベント伝達に対するViewonTouchEventメソッドの戻り値の影響
ButtonのサブクラスMyButtonを例に説明すると、onTouchEvent関数の戻り値と出力を変更することでコードの実行を判断し、MyButtonコードは以下のようになる
レイアウトファイル
マウスダウンから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コードは次のようになります.
レイアウトファイル、
onInterceptTouchEventメソッドを書き換えてfalseを返します.
レイアウトファイルでレイアウトを参照し、レイアウトにMyButtonコントロールを追加
では、Buttonをクリックすると、touchイベントはonInterceptTouchEventに渡され、MybuttonのonTouchEventメソッドに渡され、MyLinearLayoutのonTouchEventメソッドには渡されず、MyButton以外の空白領域をクリックすると、touchイベントはMyLinearLayoutのonInterceptTouchEventメソッドに渡され、MyLinearLayoutのonTouchEventメソッドに渡されます.
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メソッドに渡されます.