viewpager与viewflipper详解以及横幅轮播页Banner

来源:互联网 发布:mac os 10.13 发布 编辑:程序博客网 时间:2024/06/04 18:38

ViewPager

ViewPager的概念

在前面的博文《Android开发笔记(十九)底部标签栏TabBar》中,我们提到可以在一个主页面里通过选项卡方式,切换到不同的子页面。那么在手机上还有另外一种切换页面的方式,就是通过手势左右滑动,ViewPager就是这么一个左右滑动来切换页面的控件。
ViewPager的基本思想跟适配视图差不多,都是定义一组元素,通过适配器来展示与响应不同元素的处理,适配视图的相关说明参见《Android开发笔记(三十八)列表类视图》。


ViewPager的常用方法

下面是ViewPager的常用方法:
setAdapter : 设置ViewPager的适配器
setCurrentItem : 设置当前的页码,即默认打开ViewPager时显示哪一页的内容。
setOnPageChangeListener : 设置ViewPager的页面变化监听器。


ViewPager的适配器

适配器的相关说明参见《Android开发笔记(三十八)列表类视图》。不过ViewPager并不使用Adapter类系列的适配器,而是使用PagerAdapter。如果ViewPager里面的视图是View与View的子类,那么适配器都用PagerAdapter;如果ViewPager里面的视图Fragment,那么适配器就要用FragmentStatePagerAdapter(其实该类也是来自于PagerAdapter)。废话少说,直接上PagerAdapter的例子代码:
[java] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. private class ImageAdapater extends PagerAdapter {  
  2.       
  3.     @Override  
  4.     public int getCount() {  
  5.         return mViewList.size();  
  6.     }  
  7.   
  8.   
  9.     @Override  
  10.     public boolean isViewFromObject(View arg0, Object arg1) {  
  11.         return arg0 == arg1;  
  12.     }  
  13.       
  14.     @Override  
  15.     public void destroyItem(ViewGroup container, int position, Object object) {  
  16.         container.removeView(mViewList.get(position));  
  17.     }  
  18.       
  19.     @Override  
  20.     public Object instantiateItem(ViewGroup container, int position) {  
  21.         container.addView(mViewList.get(position));  
  22.         return mViewList.get(position);  
  23.     }  
  24.       
  25. }  


ViewPager的监听器

ViewPager一般不监听每个页面项的点击事件,而是监听页面滑动的监听事件,对应的监听器类是OnPageChangeListener。该类的三个方法介绍如下:
onPageScrollStateChanged : 翻页状态改变时调用,状态参数取值说明为:0表示静止,1表示正在滑动,2表示滑动完毕。在翻页过程中,状态值变化依次为:正在滑动->滑动完毕->静止。
onPageScrolled : 在翻页过程中调用。该方法的三个参数取值说明为:第一个参数表示当前页面的序号;第二个参数表示当前页面偏移的百分比,最小值为0,最大值为1;第三个参数表示当前页面的偏移距离,单位px。
onPageSelected : 在页面选择时调用,该方法用得较多。位置参数表示当前页面的序号。


ViewPager的页码指示器

为了方便开发者处理ViewPager的页码显示与切换,Android附带了两个工具,分别是PagerTabStrip和PagerTitleStrip。二者都是在ViewPager的页面上方展示设定的页面标题,不同之处在于,PagerTabStrip类似Tab效果,文本下面有横线;而PagerTitleStrip只是单纯的文本标题效果。下面是这两个工具的使用说明:
1、在布局文件中,二者需要作为ViewPager的的下级节点;
2、在布局文件中,二者本身无需另外定义id,代码中一般也不需要取出它们的对象做什么处理;
3、二者除了展示标题之外,还可自动响应点击事件,点击左侧或右侧的标题,页面会自动切换到左侧或右侧的视图;
4、要设置每页的标题文本,可重写PagerAdapter的getPageTitle,在对应位置返回相应的标题文字;


ViewFlipper

ViewFlipper的概念

设计ViewFlipper的初衷就是给视图翻转实现动画功能,与ViewPager相比,ViewFlipper是自动翻页动画,而ViewPager是手工翻页动画。


ViewFlipper的常用方法

下面是ViewFlipper的常用方法:
setFlipInterval : 设置每次翻页的时间间隔。
setAutoStart : 设置是否自动开始翻页。
startFlipping : 开始翻页。
stopFlipping : 停止翻页。
isFlipping : 判断当前是否正在翻页。
showNext : 显示下一个视图。
showPrevious : 显示上一个视图。
setInAnimation : 设置视图的移入动画。
getInAnimation : 获取移入动画的对象。
setOutAnimation : 设置视图的移出动画。
getOutAnimation : 获取移出动画的对象。
setDisplayedChild : 设置当前展示第几个视图。
getDisplayedChild : 获取当前展示的是第几个视图。


ViewFlipper与ViewPager的区别

1、手势左右滑动产生翻页动作
ViewPager可自动响应左右滑动事件,但ViewFlipper不会自动处理,必须在页面上注册一个手势探测器GestureDetector以及对应的手势监听器OnGestureListener,并重写监听器的onFling方法,根据前后两个手势的位移变化,决定当前是往左翻页还是往右翻页还是不翻页。
2、自动翻页
ViewPager没有可以设置自动翻页的方法,得通过Handler机制来定时调用翻页动作。而ViewFlipper就是为自动翻页而生,startFlipping和stopFlipping两个方法分别用于开始翻页与停止翻页,同时setFlipInterval方法可设置每次翻页的间隔时间。
3、多个子页面视图的适配器
ViewPager可调用setAdapter方法统一设置子页面,但ViewFlipper来源自FrameLayout,所以没有适配器的说法。ViewFlipper本质是多个子视图共存于一个FrameLayout,只是在某个时刻只显示其中的一个子视图,因此ViewFlipper的子页面是一个个addView上去的。
4、页面滑动的监听器
ViewPager可调用setOnPageChangeListener方法设置页面滑动监听器,而ViewFlipper没有专门的滑动监听器,只能通过动画监听器AnimationListener来间接实现。具体说来,便是ViewFlipper先调用getInAnimation或者getOutAnimation获取移入或移除动画的Animation对象,然后再给这些动画对象注册动画监听器setAnimationListener。下面是动画监听器需重写的几个方法:
onPageScrollStateChanged : 翻页状态改变时调用,状态参数取值说明为:0表示静止,1表示正在滑动,2表示滑动完毕。在翻页过程中,状态值变化依次为:正在滑动->滑动完毕->静止。
onPageScrolled : 在翻页过程中调用。该方法的三个参数取值说明为:第一个参数表示当前页面的序号;第二个参数表示当前页面偏移的百分比,最小值为0,最大值为1;第三个参数表示当前页面的偏移距离,单位px。
onPageSelected : 在页面选择时调用,该方法用得较多。位置参数表示当前页面的序号。
5、多页面的的页码指示器
ViewPager有对应的PagerTabStrip和PagerTitleStrip,可以自动显示页码文字;ViewFlipper则没有相关的页码类,如果需要的话,只能自己定义一个新类。



Banner

如今我们打开电商类的APP,首页上方就有很炫的Banner(横幅轮播页),里面放了最新的商品和活动的介绍图片,还能自动轮播,也可左右翻动,着实是吸引眼球。
下面是一个Banner的截图,我们看看这个Banner是如何实现的。


首先看到Banner的界面由两部分组成,一部分是轮播的图片,另一部分是图片下方的几个图标用来表示当前播放的是第几张图片。所以一个Banner需要先初始化两个队列,一个是轮播图片队列,可考虑使用ArrayList<ImageView>;另一个则是下方图标队列,可考虑使用RadioGroup或者ArrayList<Button>。


然后图片队列需要按顺序进行轮播,这个轮播效果可考虑使用ViewPager或者ViewFlipper。至于自动滚动及轮播间隔的处理,ViewPager可采取Handler与Runnable结合;ViewFlipper就更简单了,设置flipInterval属性即可指定轮播的时间间隔。


另外,不要忘了在图片轮播时,下方图标也要跟着切换。为此需要给轮播事件加个监听器,以便每次轮播都能触发下方图标的变化。对于ViewPager,可加上OnPageChangeListener监听器,在onPageSelected方法中切换下方图标。对于ViewFlipper,可加上AnimationListener监听器,在onAnimationEnd方法中切换下方图标。


接着在Banner中增加处理手势事件,因为除了自动播放,我们还希望能够用手来控制即时播放。也就是说,用户的手向屏幕右边滑动时,Banner需要立即翻到上一张图片;用户的手向屏幕左边滑动时,Banner需要立即翻到下一张图片。对于ViewPager,我们无需关心左右滑动的手势,因为ViewPager已经自动实现了。对于ViewFlipper,既可以采用粗略手势事件GestureDetector里面的onFling方法(需要注册监听器OnGestureListener),也可以采用精确手势事件里面的onTouchEvent方法。


最后,当用户点击某张图片时,页面自然要跳转到该图片对应的商品页面或者活动页面。所以Banner还需要把一个页面点击的监听器接口开放出来,用于主页面响应这个页面点击事件。具体实现的话,就是Banner在内部点击事件中调用监听器的onBannerClick方法,而主页面需要实现监听器的onBannerClick方法。


代码示例

下面是ViewPager方式实现时候的代码
BannerPager.java
[java] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. import java.util.ArrayList;  
  2. import java.util.List;  
  3.   
  4. import com.example.exmbanner.R;  
  5. import com.example.exmbanner.util.Utils;  
  6.   
  7. import android.annotation.SuppressLint;  
  8. import android.app.Activity;  
  9. import android.content.Context;  
  10. import android.os.Handler;  
  11. import android.os.Message;  
  12. import android.support.v4.view.PagerAdapter;  
  13. import android.support.v4.view.ViewPager;  
  14. import android.util.AttributeSet;  
  15. import android.util.Log;  
  16. import android.view.Gravity;  
  17. import android.view.LayoutInflater;  
  18. import android.view.MotionEvent;  
  19. import android.view.View;  
  20. import android.view.ViewGroup;  
  21. import android.widget.ImageView;  
  22. import android.widget.RadioButton;  
  23. import android.widget.RadioGroup;  
  24. import android.widget.RelativeLayout;  
  25.   
  26. @SuppressLint({ "InflateParams""ClickableViewAccessibility" })  
  27. public class BannerPager extends RelativeLayout implements View.OnClickListener {  
  28.     private static final String TAG = "BannerPager";  
  29.   
  30.     private Context mContext;  
  31.     private BannerClickListener mListener;  
  32.     private ViewPager mPager;  
  33.     private List<ImageView> mViewList = new ArrayList<ImageView>();  
  34.     private RadioGroup mGroup;  
  35.     private int mCount;  
  36.     private LayoutInflater mInflater;  
  37.     private BannerHandler mHandler;  
  38.     private int dip_13;  
  39.     private static int mInterval = 3000;  
  40.   
  41.     public BannerPager(Context context) {  
  42.         super(context);  
  43.         mContext = context;  
  44.         init();  
  45.     }  
  46.   
  47.     public BannerPager(Context context, AttributeSet attrs) {  
  48.         super(context, attrs);  
  49.         mContext = context;  
  50.         init();  
  51.     }  
  52.   
  53.     public void setOnBannerListener(BannerClickListener listener) {  
  54.         mListener = listener;  
  55.     }  
  56.   
  57.     public void start() {  
  58.         mHandler.sendEmptyMessageDelayed(0, mInterval);  
  59.     }  
  60.   
  61.     public void setImage(ArrayList<Integer> imageList) {  
  62.         for (int i = 0; i < imageList.size(); i++) {  
  63.             Integer imageID = ((Integer) imageList.get(i)).intValue();  
  64.             ImageView ivNew = new ImageView(mContext);  
  65.             ivNew.setLayoutParams(new LayoutParams(  
  66.                     LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT));  
  67.             ivNew.setScaleType(ImageView.ScaleType.FIT_XY);  
  68.             ivNew.setImageResource(imageID);  
  69.             ivNew.setOnClickListener(this);  
  70.             mViewList.add(ivNew);  
  71.             Log.d(TAG, "i=" + i + ",image_id=" + imageID);  
  72.         }  
  73.         mPager.setAdapter(new ImageAdapater());  
  74.         mPager.setOnPageChangeListener(new BannerChangeListener(this));  
  75.   
  76.         mCount = imageList.size();  
  77.         for (int i = 0; i < mCount; i++) {  
  78.             RadioButton radio = new RadioButton(mContext);  
  79.             radio.setLayoutParams(new RadioGroup.LayoutParams(dip_13, dip_13));  
  80.             radio.setGravity(Gravity.CENTER);  
  81.             radio.setButtonDrawable(R.drawable.rbt_selector);  
  82.             mGroup.addView(radio);  
  83.         }  
  84.           
  85.         mPager.setCurrentItem(0);  
  86.         setButton(0);  
  87.         mHandler = new BannerHandler();  
  88.         start();  
  89.     }  
  90.   
  91.     private void setButton(int position) {  
  92.         ((RadioButton) mGroup.getChildAt(position)).setChecked(true);  
  93.     }  
  94.   
  95.     private void init() {  
  96.         mInflater = ((Activity) mContext).getLayoutInflater();  
  97.         View view = mInflater.inflate(R.layout.banner_pager, null);  
  98.         mPager = (ViewPager) view.findViewById(R.id.banner_pager);  
  99.         mGroup = (RadioGroup) view.findViewById(R.id.banner_pager_group);  
  100.         addView(view);  
  101.         dip_13 = Utils.dip2px(mContext, 13);  
  102.     }  
  103.   
  104.     public boolean dispatchTouchEvent(MotionEvent event) {  
  105.         getParent().requestDisallowInterceptTouchEvent(true);  
  106.         return super.dispatchTouchEvent(event);  
  107.     }  
  108.   
  109.     @SuppressLint("HandlerLeak")  
  110.     private class BannerHandler extends Handler {  
  111.   
  112.         @Override  
  113.         public void handleMessage(Message msg) {  
  114.             scrollToNext();  
  115.             sendEmptyMessageDelayed(0, mInterval);  
  116.         }  
  117.     }  
  118.   
  119.     public void scrollToNext() {  
  120.         int index = mPager.getCurrentItem() + 1;  
  121.         if (mViewList.size() <= index) {  
  122.             index = 0;  
  123.         }  
  124.         mPager.setCurrentItem(index);  
  125.     }  
  126.       
  127.     private class ImageAdapater extends PagerAdapter {  
  128.           
  129.         @Override  
  130.         public int getCount() {  
  131.             return mViewList.size();  
  132.         }  
  133.   
  134.         @Override  
  135.         public boolean isViewFromObject(View arg0, Object arg1) {  
  136.             return arg0 == arg1;  
  137.         }  
  138.           
  139.         @Override  
  140.         public void destroyItem(ViewGroup container, int position, Object object) {  
  141.             container.removeView(mViewList.get(position));  
  142.         }  
  143.           
  144.         @Override  
  145.         public Object instantiateItem(ViewGroup container, int position) {  
  146.             container.addView(mViewList.get(position));  
  147.             return mViewList.get(position);  
  148.         }  
  149.           
  150.     }  
  151.   
  152.     private class BannerChangeListener implements ViewPager.OnPageChangeListener {  
  153.         private BannerChangeListener(BannerPager bannerPager) {  
  154.         }  
  155.   
  156.         @Override  
  157.         public void onPageScrollStateChanged(int arg0) {  
  158.         }  
  159.   
  160.         @Override  
  161.         public void onPageScrolled(int arg0, float arg1, int arg2) {  
  162.         }  
  163.   
  164.         @Override  
  165.         public void onPageSelected(int arg0) {  
  166.             setButton(arg0);  
  167.         }  
  168.     }  
  169.   
  170.     @Override  
  171.     public void onClick(View v) {  
  172.         int position = mPager.getCurrentItem();  
  173.         mListener.onBannerClick(position);  
  174.     }  
  175.   
  176. }  



调用页面代码
[java] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. import java.util.ArrayList;  
  2.   
  3. import android.annotation.SuppressLint;  
  4. import android.app.Activity;  
  5. import android.graphics.Point;  
  6. import android.os.Bundle;  
  7. import android.widget.TextView;  
  8. import android.widget.LinearLayout.LayoutParams;  
  9.   
  10. import com.example.exmbanner.ui.BannerClickListener;  
  11. import com.example.exmbanner.ui.BannerPager;  
  12. import com.example.exmbanner.util.Utils;  
  13.   
  14. public class BannerPagerActivity extends Activity implements BannerClickListener {  
  15.     private static final String TAG = "BannerPagerActivity";  
  16.   
  17.     private TextView tv_pager;  
  18.     private BannerPager mBanner;  
  19.   
  20.     @Override  
  21.     protected void onCreate(Bundle savedInstanceState) {  
  22.         super.onCreate(savedInstanceState);  
  23.         setContentView(R.layout.activity_banner_pager);  
  24.         tv_pager = (TextView) findViewById(R.id.tv_pager);  
  25.   
  26.         mBanner = (BannerPager) findViewById(R.id.banner_pager);  
  27.         LayoutParams params = (LayoutParams) mBanner.getLayoutParams();  
  28.         Point point = Utils.getSize(this);  
  29.         params.height = (int) (point.x * 250f/ 640f);  
  30.         mBanner.setLayoutParams(params);  
  31.           
  32.         ArrayList<Integer> bannerArray = new ArrayList<Integer>();  
  33.         bannerArray.add(Integer.valueOf(R.drawable.banner_1));  
  34.         bannerArray.add(Integer.valueOf(R.drawable.banner_2));  
  35.         bannerArray.add(Integer.valueOf(R.drawable.banner_3));  
  36.         bannerArray.add(Integer.valueOf(R.drawable.banner_4));  
  37.         bannerArray.add(Integer.valueOf(R.drawable.banner_5));  
  38.         mBanner.setImage(bannerArray);  
  39.         mBanner.setOnBannerListener(this);  
  40.     }  
  41.   
  42.     @SuppressLint("DefaultLocale")  
  43.     @Override  
  44.     public void onBannerClick(int position) {  
  45.         String desc = String.format("您点击了第%d张图片", position+1);  
  46.         tv_pager.setText(desc);  
  47.     }  
  48.   
  49. }  




下面是ViewFlipper方式实现时候的代码
BannerFlipper.java
[java] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. import java.util.ArrayList;  
  2. import java.util.List;  
  3.   
  4. import com.example.exmbanner.R;  
  5.   
  6. import android.annotation.SuppressLint;  
  7. import android.app.Activity;  
  8. import android.content.Context;  
  9. import android.util.AttributeSet;  
  10. import android.util.Log;  
  11. import android.view.GestureDetector;  
  12. import android.view.LayoutInflater;  
  13. import android.view.MotionEvent;  
  14. import android.view.View;  
  15. import android.view.animation.Animation;  
  16. import android.view.animation.AnimationUtils;  
  17. import android.widget.Button;  
  18. import android.widget.ImageView;  
  19. import android.widget.LinearLayout;  
  20. import android.widget.RelativeLayout;  
  21. import android.widget.ViewFlipper;  
  22.   
  23. @SuppressLint({ "InflateParams""ClickableViewAccessibility" })  
  24. public class BannerFlipper extends RelativeLayout {  
  25.     private static final String TAG = "BannerFlipper";  
  26.   
  27.     private Context mContext;  
  28.     private BannerClickListener mListener;  
  29.     private ViewFlipper mFlipper;  
  30.     private LinearLayout mLayout;  
  31.     private int mCount;  
  32.     private List<Button> mButtonList = new ArrayList<Button>();  
  33.     private LayoutInflater mInflater;  
  34.     private GestureDetector mGesture;  
  35.     private float mFlipGap = 20f;  
  36.   
  37.     public BannerFlipper(Context context) {  
  38.         super(context);  
  39.         mContext = context;  
  40.         init();  
  41.     }  
  42.   
  43.     public BannerFlipper(Context context, AttributeSet attrs) {  
  44.         super(context, attrs);  
  45.         mContext = context;  
  46.         init();  
  47.     }  
  48.   
  49.     public void setOnBannerListener(BannerClickListener listener) {  
  50.         mListener = listener;  
  51.     }  
  52.   
  53.      public void start() {  
  54.          startFlip();  
  55.      }  
  56.   
  57.     public void setImage(ArrayList<Integer> imageList) {  
  58.         for (int i = 0; i < imageList.size(); i++) {  
  59.             Integer imageID = ((Integer) imageList.get(i)).intValue();  
  60.             ImageView ivNew = new ImageView(mContext);  
  61.             ivNew.setLayoutParams(new LayoutParams(  
  62.                     LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT));  
  63.             ivNew.setScaleType(ImageView.ScaleType.FIT_XY);  
  64.             ivNew.setImageResource(imageID);  
  65.             mFlipper.addView(ivNew);  
  66.             Log.d(TAG, "i=" + i + ",image_id=" + imageID);  
  67.         }  
  68.   
  69.         mCount = imageList.size();  
  70.         for (int i = 0; i < mCount; i++) {  
  71.             View view = mInflater.inflate(R.layout.banner_flipper_button, null);  
  72.             Button button = (Button) view.findViewById(R.id.banner_btn_num);  
  73.             mLayout.addView(view);  
  74.             mButtonList.add(button);  
  75.         }  
  76.         mFlipper.setDisplayedChild(mCount - 1);  
  77.         startFlip();  
  78.     }  
  79.   
  80.     private void setButton(int position) {  
  81.         if (mCount > 1) {  
  82.             for (int m = 0; m < mCount; m++) {  
  83.                 if (m == position % mCount) {  
  84.                     mButtonList.get(m).setBackgroundResource(R.drawable.icon_point_c);  
  85.                 } else {  
  86.                     mButtonList.get(m).setBackgroundResource(R.drawable.icon_point_n);  
  87.                 }  
  88.             }  
  89.         }  
  90.     }  
  91.   
  92.     @SuppressWarnings("deprecation")  
  93.     private void init() {  
  94.         mInflater = ((Activity) mContext).getLayoutInflater();  
  95.         View view = mInflater.inflate(R.layout.banner_flipper, null);  
  96.         mFlipper = (ViewFlipper) view.findViewById(R.id.banner_flipper);  
  97.         mLayout = (LinearLayout) view.findViewById(R.id.banner_flipper_num);  
  98.         addView(view);  
  99.         // 该手势的onSingleTapUp事件是点击时进入广告页  
  100.         mGesture = new GestureDetector(new BannerGestureListener(this));  
  101.     }  
  102.   
  103.     public boolean dispatchTouchEvent(MotionEvent event) {  
  104.         mGesture.onTouchEvent(event);  
  105.         return true;  
  106.     }  
  107.   
  108.     final class BannerGestureListener implements GestureDetector.OnGestureListener {  
  109.         private BannerGestureListener(BannerFlipper bannerFlipper) {  
  110.         }  
  111.   
  112.         @Override  
  113.         public final boolean onDown(MotionEvent event) {  
  114.             return true;  
  115.         }  
  116.   
  117.         @Override  
  118.         public final boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {  
  119.             if (e1.getX() - e2.getX() > mFlipGap) {  
  120.                 startFlip();  
  121.                 return true;  
  122.             }  
  123.             if (e1.getX() - e2.getX() < -mFlipGap) {  
  124.                 backFlip();  
  125.                 return true;  
  126.             }  
  127.             return false;  
  128.         }  
  129.   
  130.         @Override  
  131.         public final void onLongPress(MotionEvent event) {  
  132.         }  
  133.   
  134.         @Override  
  135.         public final boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) {  
  136.             boolean result = false// true表示要继续处理  
  137.             if (Math.abs(distanceY) < Math.abs(distanceX)) {  
  138.                 BannerFlipper.this.getParent().requestDisallowInterceptTouchEvent(false);  
  139.                 result = true;  
  140.             }  
  141.             return result;  
  142.         }  
  143.   
  144.         @Override  
  145.         public final void onShowPress(MotionEvent event) {  
  146.         }  
  147.   
  148.         @Override  
  149.         public boolean onSingleTapUp(MotionEvent event) {  
  150.             int position = mFlipper.getDisplayedChild();  
  151.             mListener.onBannerClick(position);  
  152.             return false;  
  153.         }  
  154.   
  155.     }  
  156.   
  157.     private void startFlip() {  
  158.         mFlipper.startFlipping();  
  159.         mFlipper.setInAnimation(AnimationUtils.loadAnimation(mContext, R.anim.push_left_in));  
  160.         mFlipper.setOutAnimation(AnimationUtils.loadAnimation(mContext, R.anim.push_left_out));  
  161.         mFlipper.getOutAnimation().setAnimationListener(new BannerAnimationListener(this));  
  162.         mFlipper.showNext();  
  163.     }  
  164.   
  165.     private void backFlip() {  
  166.         mFlipper.startFlipping();  
  167.         mFlipper.setInAnimation(AnimationUtils.loadAnimation(mContext, R.anim.push_right_in));  
  168.         mFlipper.setOutAnimation(AnimationUtils.loadAnimation(mContext, R.anim.push_right_out));  
  169.         mFlipper.getOutAnimation().setAnimationListener(new BannerAnimationListener(this));  
  170.         mFlipper.showPrevious();  
  171.         mFlipper.setInAnimation(AnimationUtils.loadAnimation(mContext, R.anim.push_left_in));  
  172.         mFlipper.setOutAnimation(AnimationUtils.loadAnimation(mContext, R.anim.push_left_out));  
  173.         mFlipper.getOutAnimation().setAnimationListener(new BannerAnimationListener(this));  
  174.     }  
  175.   
  176.     private class BannerAnimationListener implements Animation.AnimationListener {  
  177.         private BannerAnimationListener(BannerFlipper bannerFlipper) {  
  178.         }  
  179.   
  180.         @Override  
  181.         public final void onAnimationEnd(Animation paramAnimation) {  
  182.             int position = mFlipper.getDisplayedChild();  
  183.             setButton(position);  
  184.         }  
  185.   
  186.         @Override  
  187.         public final void onAnimationRepeat(Animation paramAnimation) {  
  188.         }  
  189.   
  190.         @Override  
  191.         public final void onAnimationStart(Animation paramAnimation) {  
  192.         }  
  193.     }  
  194.   
  195. }  


调用页面代码与ViewPager方式的类似,只要把类名与控件名改了就好。




下面是横幅轮播页的效果图,因为两种方式的效果差不多,就不重复帖了


0 0