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; } };
效果预览:
缺陷:使用该控件在模拟器上显示没有问题,但是在真机上有的时候,很少的时候会出现显示半个图片的现象,不是布局问题,但没找到具体什么问题。