是的,你没看错,是ViewFlow,不是ViewPager,也不是ViewFlipper。ViewFlow是一个开源的android UI库。它提供了三个组件ViewFlow、FlowIndicator和TitleFlowIndicator。它使得由Adapter产生的ViewGroup中的View可以水平滑动。
一、使用ViewFlow库
那么什么时候可以使用这个组件呢?文档上说,当你需要在一系列不确定数目的view中滑动时,可以考虑使用ViewFlow。如果你的view数目确定,你应该使用Fragments 或兼容库里的ViewPager 。
1、使用ViewFlow
怎么使用呢?首先在你的layout文件中加入:
其中app:sidebuffer属性是ViewFlow组件自定义的,使用这些属性时,需要增加如下的xml的命名空间:
然后在你的Activity里面添加如下代码用于使用ViewFlow:
01 | ViewFlow viewFlow = (ViewFlow) findViewById(R.id.viewflow); |
02 | viewFlow.setAdapter(myAdapter); |
06 | viewFlow.setOnViewSwitchListener( new ViewSwitchListener() { |
07 | public void onSwitched(View v, int position) { |
当然,你也可以使用该库中的FlowIndicator为你在多个view中切换时提供一个指示器,目前该库已经实现了两种指示器:一种是圆点指示器FlowIndicator;另一种是标题指示器TitleFlowIndicator。
2、使用圆点指示器
圆点指示器可以这样使用:
先在layout中这样定义
然后在activity中调用它
1 | CircleFlowIndicator indic = (CircleFlowIndicator) |
2 | findViewById(R.id.viewflowindic); |
3 | viewFlow.setFlowIndicator(indic); |
圆点指示器还支持activeColor、inactiveColor、activeType(填充或描边)、inactiveType(填充或描边)、fadeOut(设置圆点自动隐藏的秒数,若为0则不会自动隐藏)、radius(圆点的半径)等。
3、使用标题指示器
标题指示器也是先layout里定义:
然后在activity中调用它:
1 | TitleFlowIndicator indicator = (TitleFlowIndicator) |
2 | findViewById(R.id.viewflowindic); |
3 | indicator.setTitleProvider(myTitleProvider); |
4 | viewFlow.setFlowIndicator(indicator); |
OK,以上就是ViewFlow库提供三大组件及其用法(来自其文档),当然你也可以把该组件库打包成jar调用。
要注意的是,如果你使用的android sdk版本是android2.2以下,最好在activity中加上如下方法
2 | public void onConfigurationChanged(Configuration newConfig) { |
3 | super .onConfigurationChanged(newConfig); |
4 | viewFlow.onConfigurationChanged(newConfig); |
二、实现了自动播放和循环的ViewFlow
网友灵台斜月对ViewFlow实现了改进,增加了自动播放功能和循环功能。这里可以下载工程代码。
滑动循环功能通过在adapter的getcount方法要返回Integer.Max_value。然后在getview方法中,由于position不断递增,可以取余数。并调用viewflow.setSelection(3*图片数)来实现循环。
自动播放是通过如下代码实现的:
02 | public void startAutoFlowTimer(){ |
03 | handler = new Handler(){ |
05 | public void handleMessage(Message msg) { |
06 | snapToScreen((mCurrentScreen+ 1 )%getChildCount()); |
07 | Message message = handler.obtainMessage( 0 ); |
08 | sendMessageDelayed(message, timeSpan); |
12 | Message message = handler.obtainMessage( 0 ); |
13 | handler.sendMessageDelayed(message, timeSpan); |
另外,原ViewFlow自带的例子在这里,直接down的代码无法使用,这个代码可以直接导入。里面有4个例子,分别展示了带圆点指示器的ViewFlow、带标题指示器的ViewFlow、view结构不同的ViewFlow及异步加载view的ViewFlow。还可以学习下如何设置自定义组件的属性。