AdapterViewFlipper的使用--自动切换的轮播图

          以前经常用viewpager+计时器来实现轮播图的效果,感觉特别麻烦,前几天把项目中的轮播图换成了AdapterViewFlipper该控件,因为该控件其实是实现自动播放的图片库的,所以我用的时候参考这文档来写的,特地来总结一下,因为写在本上确实没有电子的方便。

AdapterViewFlipper控件的介绍

          该空间继承了AdapterViewAnimator,它也会显示Adapter提供的多个View组件,但是每次只能显示一个View组件,程序可以通过showPrevious()和showNext()方法来控制该组件显示上一个,下一个组件。可以再切换的过程中显示渐隐渐显的动画效果,还可以调用控件的startFlipping()方法控制它自动播放下一个view组件。

AdapterViewFlipper的xml属性

    animateFirstView 设置显示该组件的第一个view是否使用动画
     inAnimation  组件显示时是否使用动画
     loopViews  循环到最后一个view时是否自动转头到第一个view
     outAnimation  设置组件隐藏时使用的动画
     autoStart  相关方法 startFlipping()   设置显示该组件时是否自动播放
    flipInterval  相关方法setFlipInterval(int)  设置自动播放的时间间隔

   AdapterViewFlipper的使用        

  1.在xml的布局

<com.gth.findlove.view.NotifiableViewFlipper
    android:id="@+id/business_detail_vp"
    android:flipInterval="2000"   //自动播放的时间间隔
    android:autoStart="true"
    android:loopViews="true"
    android:layout_width="match_parent"
    android:layout_height="200dp">

</com.gth.findlove.view.NotifiableViewFlipper>
重写了AdapterViewFlipper:
package com.gth.findlove.view;

import android.content.Context;
import android.util.AttributeSet;
import android.widget.AdapterViewFlipper;

/**
 * Created by admin on 2017/4/21.
 */

public class NotifiableViewFlipper extends AdapterViewFlipper {

                 private OnFlipListener onFlipListener;

                 public static interface OnFlipListener {
                 public void onShowPrevious(NotifiableViewFlipper flipper);

                         public void onShowNext(NotifiableViewFlipper flipper);
             }

                 public void setOnFlipListener(
                         OnFlipListener onFlipListener) {
                 this.onFlipListener = onFlipListener;
             }

                 public NotifiableViewFlipper(Context context) {
                 super(context);
             }

                 public NotifiableViewFlipper(Context context, AttributeSet attrs) {
                 super(context, attrs);
             }

    @Override
         public void showPrevious() {
                 super.showPrevious();
                 if(hasFlipListener()){
                         onFlipListener.onShowPrevious(this);
                     }
             }

                 @Override
         public void showNext() {
                 super.showNext();
                 if(hasFlipListener()){
                         onFlipListener.onShowNext(this);
                    }
             }

                private boolean hasFlipListener() {
                 return onFlipListener != null;
             }
     }

2.acticity的使用


//轮播图的点点
        point= (LinearLayout)findViewById(R.id.ll_point);


获取到网络数据之后,将数据进行处理。
setPicInList();//提前加入集合
setLunboTu();

initAdapter();//设置控制器



private void  setPicInList(){
    lunbolist=mBusinessDetailBean.sReturnData.sBusinessImgUrls;
}

/*设置轮播图============加小白点*/
    private void setLunboTu() {

        if(lunbolist!=null){
            //加小白点,指示器

            for(int x=0;x<lunbolist.size();x++){
                View pointview =new View(BusinessDetailActivity.this);
                //设置圆形的点  亮点 暗点
                pointview.setBackgroundResource(R.drawable.select_bg_point);

                LinearLayout.LayoutParams params=new LinearLayout.LayoutParams(15, 15);
                if(x!=0){
                    params.leftMargin=20;
                }


                //默认都是不选中的状态
                pointview.setEnabled(false);
                point.addView(pointview, params);

            }
        }

    }



/**
 * 控制器
 */
private void initAdapter() {
    if(lunbolist!=null){
        //0号的点点选中
        point.getChildAt(0).setEnabled(true);
        //0号加描述
        //  des.setText(TextIds[0]);//文本改变


        mBusinessDetailVp.setAdapter(adapter);

        mBusinessDetailVp.setOnFlipListener(adFlipListener);

    }

    id_swipe_ly.setRefreshing(false);

}

3.设置适配器

//创建自己的适配器
/**
 * 放图片
 * @author Administrator
 *
 */
//创建BaseAdapter对象,负责提供Gallery所显示的列表项
BaseAdapter adapter=new BaseAdapter() {
    @Override
    public int getCount() {
        return lunbolist.size();
    }

    @Override
    public Object getItem(int i) {
        return i;
    }

    @Override
    public long getItemId(int i) {
        return i;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        //创建一个ImageView
        ImageView imageView=new ImageView(BusinessDetailActivity.this);
        Picasso.with(BusinessDetailActivity.this).load(lunbolist.get(position)).placeholder(R.drawable.img_load).error(R.drawable.img_erro).into(imageView);
        //设置ImageView缩放类型
        imageView.setScaleType(ImageView.ScaleType.CENTER_CROP);
        //设置布局参数
        imageView.setLayoutParams(new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT));
        return imageView;
    }
};



4.设置监听 无限循环

private NotifiableViewFlipper.OnFlipListener adFlipListener = new NotifiableViewFlipper.OnFlipListener() {

                    @Override
             public void onShowPrevious(NotifiableViewFlipper flipper) {
                }

                     @Override
             public void onShowNext(NotifiableViewFlipper flipper) {

                        int position= flipper.getDisplayedChild();
                         int newPosition=position%(lunbolist.size());//无线循环
                         point.getChildAt(previousPoint).setEnabled(false);
                         point.getChildAt(newPosition).setEnabled(true);

                         //记录位置
                         previousPoint=newPosition;

                 }
         };


效果预览:
AdapterViewFlipper的使用--自动切换的轮播图AdapterViewFlipper的使用--自动切换的轮播图



缺陷:使用该控件在模拟器上显示没有问题,但是在真机上有的时候,很少的时候会出现显示半个图片的现象,不是布局问题,但没找到具体什么问题。