我简单的介绍下实现方法:其实就是listview addheaderview.只不过这个view是一个可以切换图片的view,至于这个view怎么做,就要根据自己的喜爱了,实现有多种方法,下面我简单介绍一下.
第一种:viewflipper+gesturedetector
主布局就是一个listview,这里就不介绍了,我介绍下切换图片布局
head_iamge.xml
这里我就添加一系列切换点,至于显示新闻标题,透明效果等等,大家可以自己布局,方法同理,不难实现.
接下来我们看动画布局.
push_left_in.xml
push_left_out.xml
push_right_in.xml
push_right_out.xml
我简单介绍下这些布局:
push_left_in:左边进入,则要进入的view初始位置在-100%p位置,终止位置在0,而push_left_out:左边出来,则此时view的位置在0,而终止位置在-100%p.
右进右出同理,至于alpha渐变,很简单,动画就说道这里,相信了解动画的同学们不用看就ok了.
下面重点是如何实现.
代码:
mainactivity.java
效果图:
你可以手势左右滑动图片切换,由于我们加入了动画,则在切换图片效果会比较人性,这一点比较不错.另外一点,我开启了timer,让它自己切换,感觉这点比较不错,可惜好多应用都没有这么搞,总之实现就行了,我们开发人员嘛,就是开发别人想出来的东西,感慨程序员苦逼...
如果你按照上诉操作的话会有几个问题:1,我移动图片下面的item图片也会切换,2,我在滑动切换图片的时候偶尔也会执行onclick事件,这两点bug严重不允许,为之我也煞费神经细胞啊,没办法因为基础不好,对触摸种种事件还是搞不明白,有时间了还得在看看研究研究,扯远了,下面我说下解决方法:
第一:我只让listview的第一项监听手势操作,其他的不执行.
方法很简单,自定义一个listview.重写其ontouchevent事件.
大家一看就明白了,我们只对position==0进行手势监听,也许有人问了,其实也可以直接在mainactivity中的dispatchtouchevent分发事件中获取点击listview的position,可是这样不准确,我点击第0项获取的有的是0,有的是1,原因目前不明,不过但可以肯定,这样是能获取listview的position的,所以就干脆自定义吧,这样不会出错.这样解决了不会滑动下面item图片跟着切换.
再有就是我们要把listview item的第一项 onclick事件禁止了,我们直接把这个点击事件搬到onsingletapup中,这样就不会因为手势操作而影响item的onclick事件了,这样问题基本都解决了,其实我想有简单的方法,只要把touch事件弄懂,可惜啊...不给力啊...
效果和上面一样.
经过多次测试,目前没有发现问题,如有不妥我会给出提示.
第二种方法:viewpager.
viewpager效果相比大家都熟知,因此我就省略显示的那部分,方法和上面一样,只是显示用的是viewpager而已.
但是这里面存在一个严重的问题:viewpager和listview共存的问题,二者都有自身的滑动事件,必然要产生冲突。viewpager操作起来相当的不灵敏.
这里我重点说一下解决办法:我们需要自定义listview,对其拦截事件进行处理.另外我们要用手势,判断上下左右滑动.
mylistview.java
这样viewpager滑动就不会受listview干扰了,listview上下也可以滑动.
由于自己对事件分发不是很了解,所以不过多介绍,想知道的话,自己慢慢研究吧,我这里只是提供一个解决方法,我也在学习中...
其他部分不难,这里就不讲解了.
感觉还是第二种方法好,这也是为什么那么多客户端都是这么搞,不过各有千秋,因人而异.
对第二种方法实现简单讲解:
我们的目的是:我们左右滑动viewpager的时候listview不影响,而当viewpager上下滑动的时候可以随意滑动.
我们可以这样做:我们把onintercepttouchevent返回值更改为fase,那么意味着,如果孩子存在onintercepttouchevent那么会继续传递给孩子的onintercepttouchevent...后面我们不管(此时listview失去touch事件),这个时候viewpager获取touch事件.
这个时候viewpager就可以左右滑动(不可以上下滑动)。 如果孩子不存在onintercepttouchevent,listview执行本身ontouch.
那么把onintercepttouchevent返回值更改为true.意思就是:我对touch事件进行拦截,不进行向下传递,直接执行自身的ontouch事件,这个时候viewpager就可以上下滑了(不可以左右滑动切换).
根据实情,那么我们如何动态控制这个onintercepttouchevent的返回值,这个时候我们可以借助:gesturedetector手势来实现.
上面这个方法可以根据手势来判断我们手的滑动方向.而:boolean b = mgesturedetector.ontouchevent(ev);
这个值就是onscroll返回的值.这个值是代表我们手势mgesturedetector消费了没,为什么这么说呢,因为这个和我们外界的touch分开了,就算我们在这里消费了那么外面该怎么执行就怎么执行。经过测试觉得mgesturedetector.ontouchevent(ev)这个方法就是执行手势相应方法,然后返回的是onscroll的返回值.
而当我们上下滑动的时候mgesturedetector.ontouchevent(ev)返回true,而viewpager需要上下滑动的时候只需要将onintercepttouchevent的返回值更改为true,左右滑动同理.
那么这样我们就实现了viewpager与listview滑动的冲突.
好了,就写到这里了,下面给一个demo,大家可以拿去看看!
http://download.csdn.net/detail/gulaer/4965682