博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Android自定义控件实现简单的轮播图控件
阅读量:7077 次
发布时间:2019-06-28

本文共 4695 字,大约阅读时间需要 15 分钟。

hot3.png

最近要做一个轮播图的效果,网上看了几篇文章,基本上都能找到实现,效果还挺不错,但是在写的时候感觉每次都要单独去重新在Activity里写一堆代码。于是自己封装了一下。本篇轮播图实现原理原文出处:循环广告位组件的实现,这里只是做了下封装成一个控件,不必每次重复写代码了。

效果图:

Android,自定义控件,轮播图

实现分析

轮播图的功能就是实现左右滑动的广告、图片信息展示,那我们就用ViewPager来实现,由于考虑到用户体验,我们还需要在下面加一个指示器来标示滑动到了第几张轮播图。指示器我们可以用一个线性布局来根据要展示的轮播图设置显示的View,我们要做这样的一个控件没有什么特殊的效果,其实就是两个控件的组合,只是我们要在内部处理好它们之间的交互关系(其实就是ViewPager滚动的时候,下面指示器的展示),所以我们就用自定义控件当中的组合方式来实现。 
下面开始

1、定义一个控件继承FrameLayout,写一个xml文件

public class CarouselView extends FrameLayout implements ViewPager.OnPageChangeListener {  private Context context;  private int totalCount =100;//总数,这是为实现无限滑动设置的  private int showCount;//要显示的轮播图数量  private int currentPosition =0;//当前ViewPager的位置  private ViewPager viewPager;  private LinearLayout carouselLayout;//展示指示器的布局  private Adapter adapter;  private int pageItemWidth;//每个指示器的宽度  private boolean isUserTouched = false;  public CarouselView(Context context) {    super(context);    this.context = context;  }  public CarouselView(Context context, AttributeSet attrs) {    super(context, attrs);    this.context = context;  }  public CarouselView(Context context, AttributeSet attrs, int defStyleAttr) {    super(context, attrs, defStyleAttr);    this.context = context;  }
  
    
  

上面的代码把两个要用到的控件ViewPager和carouselLayout都包含在定义的CarouselView里面了,下面就是要获取

2、onFinishInflate()中获取我们需要的控件

@Override  protected void onFinishInflate() {    super.onFinishInflate();    View view = LayoutInflater.from(context).inflate(R.layout.carousel_layout,null);    this.viewPager = (ViewPager) view.findViewById(R.id.gallery);    this.carouselLayout = (LinearLayout)view.findViewById(R.id.CarouselLayoutPage);    pageItemWidth = ConvertUtils.dip2px(context,5);    this.viewPager.addOnPageChangeListener(this);    addView(view);  }

onFinishInflate()方法是自定义控件中常用的一个方法,它表示从XML加载组件完成了,在该方法中我们通过LayoutInflater.from(context).inflate 获取到个ViewPager对象和carouselLayout对象,并对pageItemWidth进行了赋值。 

同时为viewPager设置addOnPageChangeListener。这里别忘记调用addView();否则控件就展示不了啦!

3、通过设置set方法来获取数据,同时初始化界面效果

到这一步我们已经获取到了展示轮播图的ViewPager对象,那接下来要让它展示你肯定想到了写个类继承PagerAdapter,然后重写getCount,isViewFromObject,isViewFromObject,destroyItem等方法来让ViewPager展示轮播图。但是我们又不能写得太固定,因为可能每个人想要展示的数据不一样,所以我们定义一个接口来给外部使用的人写自己的逻辑。上代码:

/定义一个接口让外部设置展示的Viewpublic interface Adapter{    boolean isEmpty();    View getView(int position);    int getCount();  }//ViewPager的适配器class ViewPagerAdapter extends PagerAdapter {    @Override    public int getCount() {      return totalCount;    }    @Override    public boolean isViewFromObject(View view, Object object) {      return view==object;    }    @Override    public Object isViewFromObject(ViewGroup container, int position) {      position %= showCount;      //调用接口的getView()获取使用者要展示的View;      View view = adapter.getView(position);      container.addView(view);      return view;    }    @Override    public void destroyItem(ViewGroup container, int position, Object object) {      container.removeView((View) object);    }    @Override    public int getItemPosition(Object object) {      return super.getItemPosition(object);    }    @Override    public void finishUpdate(ViewGroup container) {      super.finishUpdate(container);      int position = viewPager.getCurrentItem();      //实现Viewpager到第一页的实现能向左滑动      if (position==0){        position=showCount;        viewPager.setCurrentItem(position,false);      }else if (position==totalCount-1){//ViewPager到最后一页的实现向又滑动        position = showCount - 1;        viewPager.setCurrentItem(position,false);      }    }  }//为外部提供设置数据源的方法,同时为ViewPager做展示public void setAdapter(Adapter adapter){    this.adapter = adapter;    if (adapter!=null){      init();    }  }

上面的代码就是定义了一个接口让外部来设置数据,提供setAdapter来为adapter赋值,同时初始化界面效果,init()方法中就是数据的初始化,代码如下:

private void init() {    viewPager.setAdapter(null);    carouselLayout.removeAllViews();//清空之前的数据    if (adapter.isEmpty()){      return;    }    int count = adapter.getCount();    showCount = adapter.getCount();    for (int i=0;i

主要的逻辑代码就是这样啦,一个轮播图的控件就做好了。下面来看一下使用:

4、使用

xml中写我们的轮播图控件:

 

java代码中获取控件,同时设置接口

CarouselView carouselView = (CarouselView) findViewById(R.id.CarouselView);  carouselView.setAdapter(new CarouselView.Adapter() {   @Override   public boolean isEmpty() {    return false;   }   @Override   public View getView(int position) {    View view = mInflater.inflate(R.layout.item,null);    ImageView imageView = (ImageView) view.findViewById(R.id.image);    imageView.setImageResource(mImagesSrc[position]);    return view;   }   @Override   public int getCount() {    return mImagesSrc.length;   }  });

返回是否为空,在getView(int position)中return我们想返回的View,就是这么简单了啦。

希望本文所述对大家学习Android软件编程有所帮助。

转载于:https://my.oschina.net/u/2300248/blog/667053

你可能感兴趣的文章
Struts2 - 配置备忘
查看>>
Linux集群简介以及lvs-dr部署(二)
查看>>
eclipse创建maven
查看>>
layer ui使用多层弹框时,各个页面交互问题
查看>>
linux基本命令2 创建文件/文件夹/复制文件/文件夹
查看>>
BackSwap银行***利用三种全新技术清空银行帐户
查看>>
html+css+js(+JQuery)制作扑克牌图片切换效果
查看>>
电脑远程连接建立和设置连接选项操作步骤
查看>>
MySQL常用查询语句(23个)
查看>>
Date/TimePicker
查看>>
pc端车牌识别在智能机器人上的应用
查看>>
对接小结
查看>>
JMS简介与ActiveMQ实战
查看>>
余弦相似度计算
查看>>
中国的招商×××大误区
查看>>
C#解码base64编码的二进制数据的代码
查看>>
VFIO透传
查看>>
Spring Boot 整合 docker
查看>>
一个网络管理员应该掌握的mysql管理命令
查看>>
display:none
查看>>