Androidで親Viewと子viewのクリックイベント
4079 ワード
Androidのイベントタイプはキーイベントとスクリーンタッチイベントに分けられ,Touchイベントはスクリーンタッチイベントの基礎イベントであり,深く理解する必要がある.
最も簡単なスクリーンタッチ動作が一連のTouchイベントをトリガーした:ACTION_DOWN->ACTION_MOVE->ACTION_MOVE->ACTION_MOVE...->ACTION_MOVE->ACTION_UP
画面にView Groupが含まれ、このView Groupにサブviewが含まれている場合、androidシステムはTouchイベントをどのように処理しますか?ViewGroupがTouchイベントを処理するのか、それともサブviewがTouchイベントを処理するのか.私はあなたに必ずしもそうではないと確信するしかありません.ほほほ、どうしてですか.次の私の調査結果を見てください.
Androidシステムの各Viewのサブクラスには、TouchEvent処理に密接に関連する次の3つの方法があります.
1)public boolean dispatchTouchEvent(MotionEvent ev)この方法はTouchEventを配布するために用いられる
2)public boolean onInterceptTouchEvent(MotionEvent ev)この方法はTouchEventをブロックするために用いられる
3)public boolean onTouchEvent(MotionEvent ev)この方法はTouchEventを処理するために用いられる
TouchEventが発生すると、まずActivityはTouchEventを最上位のViewに渡し、
TouchEventは最上位ビューのdispatchTouchEventに最初に到着し、dispatchTouchEventメソッドによって配布されます.
dispatchTouchEventがtrueを返すと、このviewのonTouchEvent処理に渡され、
dispatchTouchEventがfalseを返す場合、このviewのinterceptTouchEventメソッドに渡して、このイベントをブロックするかどうかを決定します.
interceptTouchEventがtrueを返し、つまりブロックした場合、そのonTouchEventに処理を任せます.
InterceptTouchEventがfalseを返すと、サブviewに渡され、サブviewのdispatchTouchEventがこのイベントの配布を開始します.
イベントがある階層のサブviewのonTouchEventに渡され、このメソッドはfalseを返すと、このイベントはこのviewから上に渡され、onTouchEventが受信します.
そして、一番上に渡されたonTouchEventもfalseに戻ると、このイベントは「消失」し、次のイベントは受信できません.private LayoutInflater inflater;
public View fristView;
public View secondView;
private MyViewPager myViewPager;
public ViewPagerAdapter mViewPagerAdapter;
private List<View> views;
public Gallery mGallery;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
inflater = getLayoutInflater();
fristView = inflater.inflate(R.layout.main1, null);
secondView = inflater.inflate(R.layout.main2, null);
views = new ArrayList<View>();
views.add(fristView);
views.add(secondView);
mGallery = (Gallery) fristView.findViewById(R.id.gallery);
mGallery.setAdapter(new ImageAdapter(this));
myViewPager = (MyViewPager) findViewById(R.id.pager);
mViewPagerAdapter = new ViewPagerAdapter(views);
myViewPager.setAdapter(mViewPagerAdapter);
}
//
private List<View> views;
public ViewPagerAdapter (List<View> views){
this.views = views;
}
// arg1
@Override
public void destroyItem(View arg0, int arg1, Object arg2) {
((ViewPager) arg0).removeView(views.get(arg1));
}
@Override
public void finishUpdate(View arg0) {
// TODO Auto-generated method stub
}
//
@Override
public int getCount() {
if (views != null)
{
return views.size();
}
return 0;
}
// arg1
@Override
public Object instantiateItem(View arg0, int arg1) {
((ViewPager) arg0).addView(views.get(arg1), 0);
return views.get(arg1);
}
//
@Override
public boolean isViewFromObject(View arg0, Object arg1) {
return (arg0 == arg1);
}
@Override
public void restoreState(Parcelable arg0, ClassLoader arg1) {
// TODO Auto-generated method stub
}
@Override
public Parcelable saveState() {
// TODO Auto-generated method stub
return null;
}
@Override
public void startUpdate(View arg0) {
// TODO Auto-generated method stub
}