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

打造Android一体式轮播广告条

轮播广告条在应用中非常广泛的使用,这次在看公司一个项目时,发现多处都使用到轮播广告条的功能,看到了很多重复的代码,所以萌生了整合的想法。先来看看常见的轮播广告条的样式。ps:标题有点吹

轮播广告条在应用中非常广泛的使用,这次在看公司一个项目时,发现多处都使用到轮播广告条的功能,看到了很多重复的代码,所以萌生了整合的想法。先来看看常见的轮播广告条的样式。ps:标题有点吹牛逼了。嘎嘎

);
url.add("http://pic3.nipic.com/20090525/2416945_231841034_2.jpg");
url.add("http://img3.3lian.com/2013/s1/20/d/57.jpg");
url.add("http://pic1.nipic.com/2008-11-13/2008111384358912_2.jpg");
url.add("http://img.61gequ.com/allimg/2011-4/201142614314278502.jpg");
viewPagerBarnner.addImageUrls(url);
viewPagerBarnner.setViewPagerClick(new ViewPagerClick() {

@Override
public void viewPagerOnClick(View view) {
Toast.makeText(MainActivity.this, view.getTag().toString(), Toast.LENGTH_SHORT).show();
}
});
}

我们自定义指示器的样式:

    
<selector xmlns:android="http://schemas.android.com/apk/res/android" >
<item android:state_enabled="true">
<shape android:shape="oval">
<size android:width="3dp" android:height="3dp"/>
<solid android:color="#00FF00"/>
shape>
item>
<item android:state_enabled="false">
<shape android:shape="oval">
<size android:width="3dp" android:height="3dp"/>
<solid android:color="#FFFFFF"/>
shape>
item>
selector>

first

通过上面的效果图,我们发现基本的效果已经有了,但是还没有实现无限循环以及自动播放的功能。所以接下来我们就是实现无限循环和自动播放的功能。网上流行的两种实现方法,我们先看一种,我画了一个草图:

fliper

为了方便我们增加头尾,我将存放url和imageview的集合改为LinkedList。

    private LinkedList imageUrls = new LinkedList();
private LinkedList imageViews = new LinkedList();

主要的判断处理就是增加头尾处,这里说一点,在为ImageView的集合增加首尾的时候,为什么重新获取而不是利用集合中已经存在的,这是因为如果我们将该对象进行利用后,持有该对象的引用,然后在切换时,报该ImageView已经有父容器了。(这是我理解的)

    @Override
public void onPageSelected(int location) {
if(location == this.imageUrls.size() -1){
location = 1;
viewPager.setCurrentItem(location,false);
}else if(location == 0){
location = this.imageUrls.size() -2;
viewPager.setCurrentItem(location,false);
}
currentPostion = location;
setSelectPage(location - 1);
}


/**
* 从url地址创建imageview对象,同时初始化指示器
*/

private void createImageView(List imageUrlList){
if(imageUrlList != null && imageUrlList.size() > 0){
ImageView imageView;
View pointView;
//清除头尾
if(imageViews.size() > 1){
imageViews.removeFirst();
imageViews.removeLast();
}
for(String url : imageUrlList){
imageView = new ImageView(context);
imageView.setScaleType(ScaleType.FIT_XY);
ImageLoader.getInstance().displayImage(url, imageView);
imageView.setTag(url);
imageViews.add(imageView);

pointView = new View(context);
LinearLayout.LayoutParams params = new LinearLayout.LayoutParams((int)(indicatorSize),(int)(indicatorSize));
params.rightMargin = (int)indicatorMargin;
pointView.setLayoutParams(params);
pointView.setBackgroundDrawable(context.getResources().getDrawable(idBackgroud));
pointView.setEnabled(false);
indicatorView.addView(pointView);
}
//增加头尾
if(imageViews.size() > 1){
ImageView ivFirst = new ImageView(context);
ImageView ivLast = new ImageView(context);
ImageLoader.getInstance().displayImage(imageUrls.getLast(),ivLast);
ImageLoader.getInstance().displayImage(imageUrls.getFirst(),ivFirst);
imageViews.addFirst(ivFirst);
imageViews.addLast(ivLast);
}
viewPagerAdapter.notifyDataSetChanged();
viewPager.setCurrentItem(1);
}
}

/**
* 设置当前选中页面
* @param position
*/

private void setSelectPage(int position){
for(int index=0; index if(position == index){
indicatorView.getChildAt(index).setEnabled(true);
}else{
indicatorView.getChildAt(index).setEnabled(false);
}
}
}

/**
* 设置图片的地址,从网络加载图片
* @param imageUrls
*/

public void addImageUrls(List imageUrls) {
if(this.imageUrls.size() > 1){//清除头尾
this.imageUrls.removeFirst();
this.imageUrls.removeLast();
}
this.imageUrls.addAll(imageUrls);
if(this.imageUrls.size() >1){//增加头尾
String first = this.imageUrls.getFirst();
this.imageUrls.addFirst(this.imageUrls.getLast());
this.imageUrls.addLast(first);
}
createImageView(imageUrls);
}

这样就可以实现了ViewPager的循环,同时我们可以通过addImageUrls方法进行新增页。实现了循环,就开始自动播放,自动播放的实现无外乎几种:

  • 1、定时器:Timer
  • 2、开子线程 while true 循环
  • 3、ColckManager
  • 4、 用handler 发送延时信息,实现循环

我们通过Handler进行实现。

    private Handler mHandler = new Handler(){

@Override
public void handleMessage(Message msg) {
viewPager.setCurrentItem(currentPostion + 1);
mHandler.sendEmptyMessageDelayed(0, 3000);
}
};

/**
* 初始化View的视图
*/

private void initViews(){
...
mHandler.sendEmptyMessageDelayed(0, 3000);
}

这样就完成了一个组合的ViewPager开发。来瞄一眼效果:

second

至此,这个控件就完成了,可以很方便使用,在也不用去搞很多逻辑判断了。这里面加载网络图片使用的ImageLoader库,需要添加,或者改源码自己修改。

源码下载地址

github

下篇地址:http://blog.csdn.net/Mr_dsw/article/details/50429396


推荐阅读
  • Android 渐变圆环加载控件实现
    本文介绍了如何在 Android 中创建一个自定义的渐变圆环加载控件,该控件已在多个知名应用中使用。我们将详细探讨其工作原理和实现方法。 ... [详细]
  • 优化ListView性能
    本文深入探讨了如何通过多种技术手段优化ListView的性能,包括视图复用、ViewHolder模式、分批加载数据、图片优化及内存管理等。这些方法能够显著提升应用的响应速度和用户体验。 ... [详细]
  • Android LED 数字字体的应用与实现
    本文介绍了一种适用于 Android 应用的 LED 数字字体(digital font),并详细描述了其在 UI 设计中的应用场景及其实现方法。这种字体常用于视频、广告倒计时等场景,能够增强视觉效果。 ... [详细]
  • 本文详细介绍如何使用arm-eabi-gdb调试Android平台上的C/C++程序。通过具体步骤和实用技巧,帮助开发者更高效地进行调试工作。 ... [详细]
  • Explore how Matterverse is redefining the metaverse experience, creating immersive and meaningful virtual environments that foster genuine connections and economic opportunities. ... [详细]
  • 火星商店问题:线段树分治与持久化Trie树的应用
    本题涉及编号为1至n的火星商店,每个商店有一个永久商品价值v。操作包括每天在指定商店增加一个新商品,以及查询某段时间内某些商店中所有商品(含永久商品)与给定密码值的最大异或结果。通过线段树分治和持久化Trie树来高效解决此问题。 ... [详细]
  • 导航栏样式练习:项目实例解析
    本文详细介绍了如何创建一个具有动态效果的导航栏,包括HTML、CSS和JavaScript代码的实现,并附有详细的说明和效果图。 ... [详细]
  • 本文介绍了在使用Visual Studio 2015进行项目开发时,遇到类向导弹出“异常来自 HRESULT:0x8CE0000B”错误的解决方案。通过具体步骤和实践经验,帮助开发者快速排查并解决问题。 ... [详细]
  • 深入理解 SQL 视图、存储过程与事务
    本文详细介绍了SQL中的视图、存储过程和事务的概念及应用。视图为用户提供了一种灵活的数据查询方式,存储过程则封装了复杂的SQL逻辑,而事务确保了数据库操作的完整性和一致性。 ... [详细]
  • IneedtofocusTextCellsonebyoneviaabuttonclick.ItriedlistView.ScrollTo.我需要通过点击按钮逐个关注Tex ... [详细]
  • c# – UWP:BrightnessOverride StartOverride逻辑 ... [详细]
  • 本文详细介绍了如何使用 Yii2 的 GridView 组件在列表页面实现数据的直接编辑功能。通过具体的代码示例和步骤,帮助开发者快速掌握这一实用技巧。 ... [详细]
  • 本文介绍如何通过注册表编辑器自定义和优化Windows文件右键菜单,包括删除不需要的菜单项、添加绿色版或非安装版软件以及将特定应用程序(如Sublime Text)添加到右键菜单中。 ... [详细]
  • 作为一名新手,您可能会在初次尝试使用Eclipse进行Struts开发时遇到一些挑战。本文将为您提供详细的指导和解决方案,帮助您克服常见的配置和操作难题。 ... [详细]
  • 在使用 DataGridView 时,如果在当前单元格中输入内容但光标未移开,点击保存按钮后,输入的内容可能无法保存。只有当光标离开单元格后,才能成功保存数据。本文将探讨如何通过调用 DataGridView 的内置方法解决此问题。 ... [详细]
author-avatar
郭建将_683
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有