简介

一个通用的图片轮播效果的通用组件,方便开发者快速集成。

初学者,其实应该实现一个自定义控件的,改天有空,在学习下吧,学习能力一般,以前也没写过java,这个组件都写了好久,惭愧啊。

背景

笔者参考http://blog.csdn.net/allen315410/article/details/39294343 学习了图片轮播效果的实现。在浏览代码的过程中,总觉得图片轮播的效果和Android Activity的耦合过高,如果一个开发者要集成该功能,会将整个功能代码和自己的App代码搅在一起,提高代码的复杂度。同时图片和图片文字描述存放在两个独立的ArrayList,这样的对应关系要由开发者手动维护,时刻关注对应关系正确性。
为什么需要组件:组件开发的目的,即让开发者用最少的代码,调用最少的接口,实现开发者的需求。
以上的描述是笔者对组件概念的最基本的认识,也是基于该原则,笔者基于http://blog.csdn.net/allen315410/article/details/39294343 进行了重构,实现了一个相对内聚的组件。

图片轮播的要素

如果一个开发者需要开发一个图片轮播的功能,开发者最少需要提供的元素有哪些:

  • 轮播的图片元素
  • 每个图片对应的文字描述
  • 轮播图片在布局中的位置
  • 图片描述在布局中的位置
  • 图片轮播的时间间隔

理论上讲,开发者只需要提高以上几个元素即可,剩下的就有组件完成吧。基于以上思路,开发者大概只需要完成类似代码即可:

public class MainActivity extends Activity {//提供一个ViewPagerItem类型数组,ViewPagerItem包括了图片信息和图片对应描述信息,采用一一对应的方式,方便维护private ViewPagerItem[] viewPagerItem = new ViewPagerItem[] {new ViewPagerItem(R.drawable.a, "0图片描述信息0"),new ViewPagerItem(R.drawable.b, "1图片描述信息1"),new ViewPagerItem(R.drawable.c, "2图片描述信息2"),new ViewPagerItem(R.drawable.d, "3图片描述信息3"),new ViewPagerItem(R.drawable.e, "4图片描述信息4"),new ViewPagerItem(R.drawable.e, "5图片描述信息5"),};private ViewPagerShow mViewPagerShow;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);//提供一个layout布局容器,用来指定图片展示的位置LinearLayout container = (LinearLayout) findViewById(R.id.dot_container);//new一个ViewPagerShow,提供相应参数mViewPagerShow = new ViewPagerShow(viewPagerItem, this, (ViewPager)findViewById(R.id.vp), mHandler,(TextView)findViewById(R.id.title), container);}@Overrideprotected void onStart() {// TODO Auto-generated method stubsuper.onStart();}/*** 接收子线程传递过来的数据,调用ViewPagerShow提供的update方法,实现ui的更新*/private Handler mHandler = new Handler(){public void handleMessage(android.os.Message msg) {mViewPagerShow.update();};};@Overrideprotected void onStop() {// TODO Auto-generated method stubsuper.onStop();}
}

浏览以上代码,不难发现该功能的加入,对开发者原有的代码的侵入范围不是很大。

用尽量少的代码,完成功能需求,是软件开发人员不断的追求。

轮播组件的实现

下面附上图片轮播效果组件的代码实现:

package com.example.image.view;import android.content.Context;
import android.os.Handler;
import android.support.annotation.Nullable;
import android.support.v4.view.PagerAdapter;
import android.support.v4.view.ViewPager;
import android.util.AttributeSet;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.TextView;import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;import static android.content.ContentValues.TAG;/*** Created by image on 2017/7/14.*/class ViewPagerItem {public int iMageId;public String iMageTitle;public ViewPagerItem(int iMageId, String iMageTitle) {this.iMageId = iMageId;this.iMageTitle = iMageTitle;}
}class ViewPagerAdapter extends PagerAdapter {private List<ImageView> iMageViews;public ViewPagerAdapter(List<ImageView> iMageViews) {this.iMageViews = iMageViews;}@Overridepublic int getCount() {return iMageViews.size();}@Overridepublic boolean isViewFromObject(View arg0, Object arg1) {return arg0 == arg1;}@Overridepublic void destroyItem(ViewGroup view, int position, Object object) {// TODO Auto-generated method stubview.removeView(iMageViews.get(position));}@Overridepublic Object instantiateItem(ViewGroup view, int position) {// TODO Auto-generated method stubview.addView(iMageViews.get(position));return iMageViews.get(position);}
}class cloneView extends View {public cloneView(Context context) {super(context);}public cloneView(Context context, @Nullable AttributeSet attrs) {super(context, attrs);}public cloneView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {super(context, attrs, defStyleAttr);}public cloneView(Context context, @Nullable AttributeSet attrs, int defStyleAttr, int defStyleRes) {super(context, attrs, defStyleAttr, defStyleRes);}public Object clone(){Object o=null;try {o=super.clone();} catch (CloneNotSupportedException e) {e.printStackTrace();}return o;}
}class ViewPagerShow {private ArrayList<View> dots;private ViewPagerItem[] viewPagerItem;private List<ImageView> iMagesList;private Context context;private ViewPagerAdapter mViewPagerAdapter;private ViewPager mViewPager;private ScheduledExecutorService scheduledExecutorService;private Handler mHandler;private int currentItem = 0;private TextView titleText;private LinearLayout container;private View dot_focus, dot_unfocus;private class ViewPageTask implements Runnable{@Overridepublic void run() {currentItem = (currentItem + 1) % viewPagerItem.length;mHandler.sendEmptyMessage(0);};}public void dotUpdate() {container.removeAllViews();View view;for (int i = 0; i < this.viewPagerItem.length; i++) {if (i == currentItem) {view = LayoutInflater.from(context).inflate(R.layout.dot_focus, null);container.addView(view);} else {view = LayoutInflater.from(context).inflate(R.layout.dot_unfocus, null);container.addView(view);}}}public ViewPagerShow(final ViewPagerItem[] viewPagerItem, Context context, ViewPager mViewPager, Handler mHandler,final TextView titleText, LinearLayout container) {this.viewPagerItem = viewPagerItem;this.context = context;this.mViewPager = mViewPager;this.mHandler = mHandler;this.titleText = titleText;this.container = container;this.dot_focus = dot_focus;this.dot_unfocus = dot_unfocus;/* show first pic title */titleText.setText(viewPagerItem[0].iMageTitle);iMagesList = new ArrayList<ImageView>();for (int i = 0; i < this.viewPagerItem.length; i++) {ImageView imageView = new ImageView(context);imageView.setBackgroundResource(viewPagerItem[i].iMageId);imageView.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {// TODO Auto-generated method stubLog.d(TAG, "onClick: onClick");;}});iMagesList.add(imageView);}dotUpdate();mViewPagerAdapter = new ViewPagerAdapter(iMagesList);mViewPager.setAdapter(mViewPagerAdapter);mViewPager.setOnPageChangeListener(new ViewPager.OnPageChangeListener() {@Overridepublic void onPageSelected(int position) {titleText.setText(viewPagerItem[position].iMageTitle);currentItem = position;dotUpdate();}@Overridepublic void onPageScrolled(int arg0, float arg1, int arg2) {}@Overridepublic void onPageScrollStateChanged(int arg0) {}});scheduledExecutorService = Executors.newSingleThreadScheduledExecutor();scheduledExecutorService.scheduleWithFixedDelay(new ViewPageTask(), 5, 5, TimeUnit.SECONDS);}public void update() {mViewPager.setCurrentItem(currentItem);titleText.setText(viewPagerItem[currentItem].iMageTitle);dotUpdate();}
}

图片轮播的原理,基本都是参考http://blog.csdn.net/allen315410/article/details/39294343 该篇blog的介绍,这里做的主要的事情即把相关的接口进行一个整理,集中,剥离出一个通用的处理组件,方便开发者的集成。

目前该组件的实现还比较粗糙,待后续持续的更新,完善

文章写的很随意,时间精力关系很多细节没有讲到,最后附上github地址,供参考:https://github.com/imagec/ViewPager

Android App图片轮播效果的组件化相关推荐

  1. android首页图片轮播效果,Android_Android自动播放Banner图片轮播效果,先看一下效果图支持本地图 - phpStudy...

    Android自动播放Banner图片轮播效果 先看一下效果图 支持本地图片以及网络图片or本地网络混合. 使用方式: android:id="@+id/banner" andro ...

  2. android 自适应图片轮播,Android使用Recyclerview实现图片轮播效果的方法

    Android使用Recyclerview实现图片轮播效果的方法 发布时间:2020-06-23 15:47:58 来源:亿速云 阅读:113 作者:清晨 这篇文章将为大家详细讲解有关Android使 ...

  3. 无需编程,我教你打造H5页面图片轮播效果

    图片轮播是手机App和手机网页上常见的功能,用于在有限的网页空间内展示一组产品图片或者照片,同时还有非常吸引人的动画效果.现在,H5页面和App上也可以加入图片轮播功能了,希望这个图片轮播效果能够给你 ...

  4. 移动端实现文字轮播_使用原生JS实现移动端图片轮播效果(一)

    PC端上实现图片轮播效果非常简单,只要通过使用click事件就可以非常简单的实现效果,但是在移动端上,就要通过核心的touch事件来实现.话不多说,现在我们就开始移动端轮播效果的实现. 首先就是原生J ...

  5. php制作图片轮播_图片轮播效果实现方法

    图片轮播效果如何实现呢本文主要介绍了JQuery实现图片轮播效果的制作原理以及实现代码,文章末尾附上源码下载,具有很好的参考价值.下面跟着小编一起来看下吧,希望能帮助到大家. 用JQuery操作DOM ...

  6. html5jqueryl轮播图,基于JQuery的实现图片轮播效果(焦点图)

    完整的演示代码: JQuery实现图片轮播效果 #banner {position:relative; width:478px; height:286px; border:1px solid #666 ...

  7. axure 动态面板实现图片轮播效果(淘宝)

    淘宝中经常可以看到店铺中的图片轮播效果,本经验将通过axure7.0实现 工具/原料 axure7.0 方法/步骤 下载需要轮播的图片 将图片引入至axure中,将引入的第一张图片转为动态面板 将动态 ...

  8. java图片特效轮播代码_JQuery实现图片轮播效果

    [实例演示] 1 2 3 4 用JQuery操作DOM确实很方便,并且JQuery提供了非常人性化的API应付我们的各种需求,其中选择器在此示例-"JQuery实现图片轮播效果"上 ...

  9. Javascript实现图片轮播效果。

    用js做一个简单的图片轮播效果. 思路如下:用JavaScript来控制轮播的图片的样式(margin-left).用计时器来控制图片的自动播放.鼠标点击控制图片的翻页. 效果图如下.具有以下功能:1 ...

最新文章

  1. DataGrid能否动态合并一笔订单下面的多个交易
  2. Python字典基础
  3. 从零开始一个http服务器(五)-模拟cgi
  4. session already invalidate
  5. itextpdf添加表格元素_使用iText填充pdf表单
  6. python观察日志(part11)--管道及MD5文件比较
  7. P3703-[SDOI2017]树点涂色【LCT,线段树】
  8. ​rsync守护进程模式实践排错08
  9. java 等待时间_java工作复习——4大时间等待——显示等待
  10. Unity Ragdoll 实现死亡效果 心得+坑点总结
  11. 比较三个数,求最大数字 ( 应用条件运算符:?)
  12. 深入浅出mfc之6大技术 运行时类型识别 DCLARE_DYNCREATE、DECLARE_DYNAMIC 、DECLARE_SERIAL、RUNTIME_CLASS、DECLARE_SERIAL 等
  13. Bean的生命周期详解
  14. FTP上传失败报错227 Entering Passive Model (222,111,8,111,10,40)
  15. android版直播伴侣,来疯直播伴侣
  16. NETWARE系统加入服务器,如何在 Netware 服务器中安装多块网卡
  17. c语言的条件运算符,条件运算符c语言
  18. 关于销售订单高级定价的一点疑惑
  19. 【文件系统】uploader实战详解实现分片上传、秒传、续传等(1)
  20. 2020春季学期哈工大软件构造学习心得三

热门文章

  1. python turtle画圣诞树动图_圣诞节!教你用Python画棵圣诞树
  2. dedecms怎么改php版本_玩转Termux:手把手教你在手机上安装php与nginx!
  3. STL源码剖析 slist单向链表概述
  4. STL源码剖析 内存基本处理工具 初始化空间的五个函数
  5. Python学习1 基础语法 数据类型 计算机基础
  6. Android Gradle 批量修改生成的apk文件名
  7. A饭福利,AMD Mantle API获众多游戏开发商青睐!
  8. 系统程序员成长计划-走近专业程序员
  9. 解决 : Shell 脚本 $‘\r‘: command not found 问题
  10. Activiti工作流框架学习(一)环境的搭建和数据表的了解