ViewPager和内部view之间的事件分发及轮播图

viewpager 在滑动的过程中是如何触发view身上的事件的,换句话说,viewpager在滑动的过程中到底是滑动的它里面的view,还是滑动的viewpager本身?

一、示例代码:

1、自定义ViewPager:MyViewPager,重新dispatchTouchEvent方法,添加一些事件处理的log信息。

package com.example.viewpagerdemo;import android.content.Context;import android.support.v4.view.ViewPager;import android.util.AttributeSet;import android.util.Log;import android.view.MotionEvent;{private String TAG = “viewpagertest”;public MyViewPager(Context context, AttributeSet attrs) {super(context, attrs);}(MotionEvent ev) {switch (ev.getAction()) {case MotionEvent.ACTION_DOWN:Log.i(TAG , “===MyViewPager MotionEvent.ACTION_DOWN===”);break;case MotionEvent.ACTION_MOVE:Log.i(TAG , “===MyViewPager MotionEvent.ACTION_MOVE===”);break;case MotionEvent.ACTION_UP:Log.i(TAG , “===MyViewPager MotionEvent.ACTION_UP===”);break;case MotionEvent.ACTION_CANCEL:Log.i(TAG , “===MyViewPager MotionEvent.ACTION_CANCEL===”);break;}return super.dispatchTouchEvent(ev);}}

2、在activity中设置viewpager的数据适配器,给view添加touch事件监听器,添加事件处理的log信息。

package com.example.viewpagerdemo;import android.app.Activity;import android.os.Bundle;import android.support.v4.view.PagerAdapter;import android.util.Log;import android.view.MotionEvent;import android.view.View;import android.view.View.OnTouchListener;import android.view.ViewGroup;import android.view.Window;import android.widget.ImageView;{private String TAG = “viewpagertest”;private Integer[] imgList = {R.drawable.first,R.drawable.second,R.drawable.third,R.drawable.four};(Bundle savedInstanceState) {super.onCreate(savedInstanceState);requestWindowFeature(Window.FEATURE_NO_TITLE);setContentView(R.layout.activity_main);MyViewPager viewPager = (MyViewPager) findViewById(R.id.myviewpager);viewPager.setAdapter(new MyAdapter());}class MyAdapter extends PagerAdapter {() {return 4;}(View arg0, Object arg1) {return arg0 == arg1;}@Overridepublic Object instantiateItem(ViewGroup container, int position) {View view = View.inflate(getApplicationContext(), R.layout.view_item, null);ImageView imageView = (ImageView) view.findViewById(R.id.iv);imageView.setBackgroundResource(imgList[position]);view.setOnTouchListener(new OnTouchListener() {(View v, MotionEvent ev) {switch (ev.getAction()) {case MotionEvent.ACTION_DOWN:Log.d(TAG , “===view MotionEvent.ACTION_DOWN===”);break;case MotionEvent.ACTION_MOVE:Log.d(TAG , “===view MotionEvent.ACTION_MOVE===”);break;case MotionEvent.ACTION_UP:Log.d(TAG , “===view MotionEvent.ACTION_UP===”);break;case MotionEvent.ACTION_CANCEL:Log.d(TAG , “===view MotionEvent.ACTION_CANCEL===”);break;}return true;}});((MyViewPager)container).addView(view);return view;}(ViewGroup container, int position, Object object) {((MyViewPager)container).removeView((View) object);}}}

二、事件分发测试:

1、点击:

logcat:

分析: 内部view的setOnTouchListener的onTouch()方法返回true,ACTION_DOWN、ACTION_UP事件都由内部view消费掉了。

2、滑动(滑一点点,ViewPager未改变):

logcat:

分析: 内部view的setOnTouchListener的onTouch()方法返回true,ACTION_DOWN、ACTION_MOVE、ACTION_UP事件都由内部view消费掉了。

3、滑动:

logcat:

分析:内部view的ACTION_CANCEL事件被触发,后续事件被外部viewpager接管。

总结: 前提:内部view的setOnTouchListener的onTouch()方法返回true。(表示该View内部消化掉了所有事件) 滑动viewpager去切换不同的item时: 当滑动的距离没有达到阀值(通常viewpager还在当前item),事件会一直作用在内部的view身上, 当滑动的距离(像素点)达到一定阀值(getScaledTouchSlop())时(通常viewpager已滑到下一个item),会触发内部view的ACTION_CANCEL事件。后续的ACTION_MOVE、ACTION_UP都被viewpager接管,,作用在外面的viewpager身上。 补充:

人之相识,贵在相知;人之相知,贵在知心。

ViewPager和内部view之间的事件分发及轮播图

相关文章:

你感兴趣的文章:

标签云: