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
        
    }