Android自定义View——自定义ViewPager

 

第一部分:自定义ViewGroup的使用,手势识别器和Scroller滑动

第二部分:处理滑动监听,处理滑动冲突,增加ViewPager的指示器

 

 

常见的滑动冲突:外部滑动方向和内部滑动方向不一致、外部滑动方向和内部滑动方向一致。

我们自定义的ViewPager如果在其中一页中存在ListView,那么就需要解决滑动冲突的问题。

由于系统自带ViewPager中,自己已经解决了滑动冲突。

 

 

1、创建一个类,继承ViewGroup,由于ViewPager里面包含多个子View,所以继承这个类,实现onLayout方法

onLayout:这个方法是对我们该View的一个位置摆放,这里可以看到onLayout这(int l,int t,int r,int b)这四个参数,分别代表着这个ViewPager的左上右下的位置,由于你引用ViewPager是match_parent,所以l和t为0,r和b为宽和高的距离

 


2、我们在自己的Activity中引用自定义的这个组件

 

 


3、复制几张图片作为演示,并为他们创建Id数组


4、接着我们需要对图片进行初始化,并加入到ViewPager中,我们写个初始化方法,并将他们放在构造方法中

 


5、这个时候,启动程序,你是看不到有图片出现的,因为你还没有对这几张图片进行位置的摆放,所以需要在onLayout中进行位置处理


这样处理的好处就是将图片一字排开

 


6、现在已经排好了图片,接着我们就来处理滑动事件了,我们通过一个手势识别器自动帮我们识别滑动事件



通过onTouchEvent委托给手势识别器,并且返回true,让这个控件消耗这个事件


这个时候我们就可以看下效果图

7、我们看到跟ViewPager还差一点,就是滑到第几张就自动复原和不能超出头和尾部的图片,这时就要处理滑动事件了


效果图

8、基本效果已经出来了,就是没有很自然的滑动过去,那么这个时候就要用到scroller了


 



可以将ScrollTo替换掉了,让它自然滑动



使用invalidate这个方法会有执行一个回调方法computeScroll,我们来重写这个方法



其实Scroller的原理就是用ScrollTo来一段一段的进行,最后看上去跟自然的一样,必须使用postInvalidate,这样才会一直回调computeScroll这个方法,直到滑动结束。基本上ViewPager的效果就出来了,看下效果图:



以下是这一部分的整个类的源码



 

1、接下来介绍指示器的完成,指示器用RadioButton来实现,在xml中编写RadioGroup


2、在主页面中对RadioButton初始化


3、回到我们的MyViewPager类,创建ViewPager的监听事件接口


4、创建ViewPager设置页面的方法,并调用接口的onPagerChange方法


这个时候,滑动事件处理就可以用setCurrentItem方法来替代


5、回到Activity中进行绑定事件


这样就完成了切换效果,看效果图

 



 

1、我们在ViewPager中嵌套一个ScrollView作为它的子View,这样ViewPager是左右滑动,ScrollView是上下滑动,那么就造成了滑动冲突

创建一个ScrollView的xml文件

 


2、在主界面中添加这个页面到ViewPager中,同时增加一个RadioButton


这个时候你可以看到增加了一个页面,但是页面是空白的:由于ViewGroup只遍历它的一个子View(即在这里的ScrollView),并不会去遍历ScrollView里面的内容,所以必须重写它的onMeasure方法,对ScrollView的子View进行遍历


查看效果图

 


这个时候你会发现这个页面只能上下滑动不能左右滑动,所以需要处理滑动事件冲突

3、重写父控件的onInterceptTouchEvent方法,如果是左右滑动,苏越我们的父控件就把滑动事件拦截下来


这个时候还需要把将ACTION_DOWN传递给手势识别器,因为拦截了MOVE的事件后,DOWN的事件也要给拦截给手势识别器,否则会丢失事件


到现在,ViewPager就完成了滑动冲突的处理,既能上下滑动和左右滑动

posted @ 2018-09-10 11:09  王凤霞  阅读(1818)  评论(0编辑  收藏  举报
友情链接:回力 | 中老年高档女装 | 武汉雅思 | 武汉托福 | 武汉sat培训