热门标签 | HotTags
当前位置:  开发笔记 > Android > 正文

Android自定义图片轮播Banner控件使用解析

这篇文章主要为大家详细介绍了Android自定义图片轮播Banner控件的使用方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

图片轮播控件,可以说是每个App基本上都会用到的。它可以用来动态的展示多个图片,之前写过两篇博客:实现ViewPager无限循环的方式一和实现ViewPager无限循环的方式二,在这两篇博客中,分析了两种实现ViewPager无限循环的原理,但是在使用的过程中,代码的解偶性很低,所以就使用自定义View的方式,实现无限循环的图片轮播的封装。

先看看效果:

功能特点

  1. 支持自定义宽高比例
  2. 支持自定义图片切换时间
  3. 支持自定义指示点的颜色
  4. 支持自定义指示点的背景色
  5. 支持自定义指示点的高度
  6. 支持是否显示指示点
  7. 支持每个图片设置不同的点击事件

使用简单

 

实现步骤

  • 声明自定义的属性
  • 创建一个类继承RelativeLayout
  • 解析属性

声明自定义的属性

在values/attrs文件中创建自定义的属性



  
      
       
       
     
     
      
     
  



创建BannerView类

public class BannerView extends RelativeLayout {

  public BannerView(Context context) {
    this(context, null);
  }

  public BannerView(Context context, AttributeSet attrs) {
    this(context, attrs, 0);
  }

  public BannerView(Context context, AttributeSet attrs, int defStyleAttr) {
    super(context, attrs, defStyleAttr);}

在BannerView中声明变量属性

private Context context;

  private Handler handler;
  private ImageLoader imageLoader;
  private DisplayImageOptions options;
  private boolean isHaveHandler = true;// 当用户点击轮播图时,取消handler队列,也就是取消滚动
  // 控件Start
  private ViewPager viewPager;
  private LinearLayout indicator;// 指示器
  private onItemClickListener listener;
  // 控件End

  // 自定义属性Start
  private float mAspectRatio; // 宽高比
  private int defaultImageResource; // 默认占位图
  private int updateTime; // 图片切换的时间间隔,默认3秒
  private boolean showIndicator; // 是否显示指示器,默认显示
  private int indicatorHeight;// 指示器的高度,默认35dp
  private int indicatorPositionSize; // 指示器的大小
  private int indicatorBackground; // 指示器的背景颜色
  // 自定义属性End
  // 数据Start
  private int imageCount;
  private int lastPosition;

  private List imageResources;
  private List imageUrls;
  // 数据End

解析自定义属性的值

接下来为自定义的属性赋值,在3个参数的构造方法中初始化变量。

public BannerView(Context context, AttributeSet attrs, int defStyleAttr) {
    super(context, attrs, defStyleAttr);
    parseCustomAttributes(context, attrs);
    this.cOntext= context;
    handler = new Handler();
    imageLoader = ImageLoader.getInstance();
    optiOns= HSApplication.getDisplayOptions().build();
    initViews();
  }
  /**
   * 解析自定义属性
   *
   * @param context
   * @param attrs
   */
  private void parseCustomAttributes(Context context, AttributeSet attrs) {
    TypedArray typedArray = context.obtainStyledAttributes(attrs, R.styleable.BannerView);
    mAspectRatio = typedArray.getFloat(R.styleable.BannerView_aspectRatio, 0f);
    defaultImageResource = typedArray.getResourceId(R.styleable.BannerView_defaultSrc,
        R.drawable.about_us);
    updateTime = typedArray.getInt(R.styleable.BannerView_updateTime, 3000);
    showIndicator = typedArray.getBoolean(R.styleable.BannerView_indicatorVisible, true);
    indicatorHeight = (int) (typedArray.getDimension(R.styleable.BannerView_indicatorHeight,
        Utils.dip2px(context, 35)));
    indicatorBackground = typedArray.getResourceId(R.styleable.BannerView_indicatorBackground,
        R.color.white_alpha00);
    indicatorPositiOnSize= (int) typedArray.getDimension(
        R.styleable.BannerView_indicatorPositionSize, Utils.dip2px(context, 5));
    typedArray.recycle();
  }
  private void initViews() {
    viewPager = new ViewPager(context);
    viewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {
      @Override
      public void onPageScrolled(int position, float positionOffset,
          int positionOffsetPixels) {

      }

      @Override
      public void onPageSelected(int position) {
        if (showIndicator) {
          for (int i = 0; i 

控件和自定义的属性都经过赋值和初始化了,接下来,该为设置图片资源了。

 public void setImageResources(List imageResources) {
    if (imageResources == null || imageResources.size() == 0) {
      throw new RuntimeException("图片资源为空");
    }
    this.imageResources = imageResources;
    imageCount = imageResources.size();
  }

  public void setImageUrls(List imageUrls) {
    if (imageUrls == null || imageUrls.size() == 0) {
      throw new RuntimeException("图片地址资源为空");
    }
    this.imageUrls = imageUrls;
    imageCount = imageUrls.size();
    loadImages();
  }

  private void loadImages() {
    if (showIndicator) {
      addIndicationPoint();
    }
    viewPager.setAdapter(new MyViewPageAdapter());
    viewPager.setCurrentItem(200 - (200 % imageCount));
    handler.removeCallbacks(updateRunnable);
    handler.postDelayed(updateRunnable, updateTime);
  }

  /**
   * 添加指示点到指示器中
   */
  private void addIndicationPoint() {
    // 防止刷新重复添加
    if (indicator.getChildCount() > 0) {
      indicator.removeAllViews();
    }
    View pointView;
    int margin = Utils.dip2px(context, 5f);
    LinearLayout.LayoutParams layoutParams = new LinearLayout.LayoutParams(
        indicatorPositionSize, indicatorPositionSize);
    layoutParams.setMargins(margin, margin, margin, margin);

    for (int i = 0; i 

时间太仓促,解释的不是太详细,可以移步我的GitHub查看完整代码。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。


推荐阅读
  • RecyclerView初步学习(一)
    RecyclerView初步学习(一)ReCyclerView提供了一种插件式的编程模式,除了提供ViewHolder缓存模式,还可以自定义动画,分割符,布局样式,相比于传统的ListVi ... [详细]
  • Android LED 数字字体的应用与实现
    本文介绍了一种适用于 Android 应用的 LED 数字字体(digital font),并详细描述了其在 UI 设计中的应用场景及其实现方法。这种字体常用于视频、广告倒计时等场景,能够增强视觉效果。 ... [详细]
  • 国内BI工具迎战国际巨头Tableau,稳步崛起
    尽管商业智能(BI)工具在中国的普及程度尚不及国际市场,但近年来,随着本土企业的持续创新和市场推广,国内主流BI工具正逐渐崭露头角。面对国际品牌如Tableau的强大竞争,国内BI工具通过不断优化产品和技术,赢得了越来越多用户的认可。 ... [详细]
  • 本文介绍了如何使用JQuery实现省市二级联动和表单验证。首先,通过change事件监听用户选择的省份,并动态加载对应的城市列表。其次,详细讲解了使用Validation插件进行表单验证的方法,包括内置规则、自定义规则及实时验证功能。 ... [详细]
  • 本文详细介绍了如何使用 Yii2 的 GridView 组件在列表页面实现数据的直接编辑功能。通过具体的代码示例和步骤,帮助开发者快速掌握这一实用技巧。 ... [详细]
  • 本文详细介绍了Java中org.eclipse.ui.forms.widgets.ExpandableComposite类的addExpansionListener()方法,并提供了多个实际代码示例,帮助开发者更好地理解和使用该方法。这些示例来源于多个知名开源项目,具有很高的参考价值。 ... [详细]
  • 本文介绍如何使用 Sortable.js 库实现元素的拖拽和位置交换功能。Sortable.js 是一个轻量级、无依赖的 JavaScript 库,支持拖拽排序、动画效果和多种插件扩展。通过简单的配置和事件处理,可以轻松实现复杂的功能。 ... [详细]
  • 探讨一个显示数字的故障计算器,它支持两种操作:将当前数字乘以2或减去1。本文将详细介绍如何用最少的操作次数将初始值X转换为目标值Y。 ... [详细]
  • 本文详细介绍了Java编程语言中的核心概念和常见面试问题,包括集合类、数据结构、线程处理、Java虚拟机(JVM)、HTTP协议以及Git操作等方面的内容。通过深入分析每个主题,帮助读者更好地理解Java的关键特性和最佳实践。 ... [详细]
  • 扫描线三巨头 hdu1928hdu 1255  hdu 1542 [POJ 1151]
    学习链接:http:blog.csdn.netlwt36articledetails48908031学习扫描线主要学习的是一种扫描的思想,后期可以求解很 ... [详细]
  • 本文详细介绍了如何在 Spring Boot 应用中通过 @PropertySource 注解读取非默认配置文件,包括配置文件的创建、映射类的设计以及确保 Spring 容器能够正确加载这些配置的方法。 ... [详细]
  • This document outlines the recommended naming conventions for HTML attributes in Fast Components, focusing on readability and consistency with existing standards. ... [详细]
  • 本文详细介绍了Java中org.w3c.dom.Text类的splitText()方法,通过多个代码示例展示了其实际应用。该方法用于将文本节点在指定位置拆分为两个节点,并保持在文档树中。 ... [详细]
  • 本文详细介绍了 Apache Jena 库中的 Txn.executeWrite 方法,通过多个实际代码示例展示了其在不同场景下的应用,帮助开发者更好地理解和使用该方法。 ... [详细]
  • 在现代网络环境中,两台计算机之间的文件传输需求日益增长。传统的FTP和SSH方式虽然有效,但其配置复杂、步骤繁琐,难以满足快速且安全的传输需求。本文将介绍一种基于Go语言开发的新一代文件传输工具——Croc,它不仅简化了操作流程,还提供了强大的加密和跨平台支持。 ... [详细]
author-avatar
mobiledu2502870133
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有