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

来源:互联网 发布:下载硕鼠软件 编辑:程序博客网 时间:2024/06/05 23:55

          以前经常用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;                 }         };


效果预览:




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


原创粉丝点击