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

android使用ViewPager实现轮播效果

这篇文章主要为大家详细介绍了android使用ViewPager实现轮播效果,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

ViewPager:一个可以实现视图左右滑动切换的控件。

ViewPager的基本使用:

ViewPager的视图需要通过PagerAdapter来实现显示。

PagerAdapter的主要方法:

  ● getCount 视图的数量

  ● instantiateItem 添加视图

  ● destroyItem 销毁视图

  ● isViewFromObject 是否由对象创建视图

ViewPager的常用方法:

setAdapter 设置适配器

addOnPageChangeListener 监听页面切换的状态

setCurrentItem 设置当前页面的索引

实现广告轮播

技术点分析:

1、网络连接

2、JSON解析

3、ViewPager的初始化

4、图片的异步加载

5、圆点指示器的实现

使用selector+shape实现圆点图片

动态创建ImageView添加到集合中,同时添加到布局中

在ViewPager切换事件中,切换圆点状态

6、自动切换效果

使用Handler的post方法,定时执行代码
资源文件:
mydot.xml //创建圆点资源,放在drawable文件下

<&#63;xml version="1.0" encoding="utf-8"&#63;> 
 
  
   
    
    
   
  
   
   
    
    
   
  
 
 

布局文件:

activity_main.xml

 
 
  
 

activity_banner.xml

 

java代码

ImageLoader.java //该代码是通过URL获取图片资源

package cn.edu.huse.banner_re.util; 
import android.graphics.Bitmap; 
import android.graphics.BitmapFactory; 
import android.os.AsyncTask; 
import java.io.IOException; 
import java.io.InputStream; 
import java.net.HttpURLConnection; 
import java.net.MalformedURLException; 
import java.net.URL; 
 
/** 
 * 图片加载的工具类 
 * @author xray 
 * 
 */ 
public class ImageLoader { 
 
 /** 
  * 图片加载完成的回调接口 
  * 添加URL参数,用于做图片错位判断 
  */ 
 public interface OnImageLoadListener{ 
  //完成图片加载 
  void onImageLoadComplete(String url, Bitmap bitmap); 
 } 
  
 private OnImageLoadListener mListener; 
  
 /** 
  * 启动图片加载任务 
  * @param urlStr 
  * @param listener 
  */ 
 public void loadImage(String urlStr,OnImageLoadListener listener){ 
  this.mListener = listener; 
  new ImageLoadTask().execute(urlStr); 
 } 
  
 /** 
  * 图片加载任务 
  * @author xray 
  * 
  */ 
 class ImageLoadTask extends AsyncTask{ 
   
  @Override 
  protected UrlAndBitmap doInBackground(String... params) { 
    
   try { 
    //创建URL,指定图片地址 
    URL url = new URL(params[0]); 
    //打开连接获得HttpURLConnection对象 
    HttpURLConnection cOnn= (HttpURLConnection) url.openConnection(); 
    //获得文件输入流 
    InputStream stream = conn.getInputStream(); 
    //把输入流转换为图片 
    Bitmap bmp = BitmapFactory.decodeStream(stream); 
    //关闭流 
    stream.close(); 
    return new UrlAndBitmap(params[0],bmp); 
   } catch (MalformedURLException e) { 
    e.printStackTrace(); 
   } catch (IOException e) { 
    e.printStackTrace(); 
   } 
   return null; 
  } 
 
  //包装图片地址和图片 
  class UrlAndBitmap{ 
   String url; 
   Bitmap bitmap; 
   public UrlAndBitmap(String url, Bitmap bitmap) { 
    this.url = url; 
    this.bitmap = bitmap; 
   } 
  } 
   
  @Override 
  protected void onPostExecute(UrlAndBitmap result) { 
   //进行接口回调 
   if(mListener != null){ 
    mListener.onImageLoadComplete(result.url,result.bitmap); 
   } 
  } 
 } 
} 

JSONLoader.java
//读取服务器json

package cn.edu.huse.banner_re.util; 
 
import android.os.AsyncTask; 
 
import java.io.IOException; 
import java.io.InputStream; 
import java.net.HttpURLConnection; 
import java.net.MalformedURLException; 
import java.net.URL; 
 
/** 
 * 读取服务器JSON的工具类 
 * @author xray 
 * 
 */ 
public class JSONLoader { 
  
 public interface OnJSONLoadListener{ 
  void onJSONLoadComplete(String json); 
 } 
  
 private OnJSONLoadListener mListener; 
  
 public void loadJSON(String urlStr,OnJSONLoadListener listener){ 
  this.mListener = listener; 
  new JSONLoadTask().execute(urlStr); 
 } 
  
 class JSONLoadTask extends AsyncTask{ 
 
  @Override 
  protected String doInBackground(String... params) { 
   try { 
    URL url = new URL(params[0]); 
    HttpURLConnection cOnn= (HttpURLConnection) url.openConnection(); 
    InputStream inputStream = conn.getInputStream(); 
    byte[] buffer = new byte[1024]; 
    int len = 0; 
    //StringBuffer 线程安全,性能低 VS StringBuilder 线程不安全,性能高 
    StringBuilder strB = new StringBuilder(); 
    while((len = inputStream.read(buffer)) != -1){ 
     //将字节码转换为String 
     String str = new String(buffer,0,len); 
     strB.append(str); 
    } 
    inputStream.close(); 
    return strB.toString(); 
   } catch (MalformedURLException e) { 
    e.printStackTrace(); 
   } catch (IOException e) { 
    e.printStackTrace(); 
   } 
   return null; 
  } 
 
  @Override 
  protected void onPostExecute(String result) { 
   if(mListener != null){ 
    mListener.onJSONLoadComplete(result); 
   } 
  }  
 } 
} 

MyViewPagerAdapter.java

package cn.edu.huse.banner_re.adapter; 
 
import java.util.List; 
 
import android.support.v4.view.PagerAdapter; 
import android.view.View; 
import android.view.ViewGroup; 
import android.widget.ImageView; 
 
/** 
 * 图片轮播的适配器 
 * @author Lenovo 
 * 
 */ 
public class MyViewPagerAdapter extends PagerAdapter { 
 
 private List mData; 
  
 public MyViewPagerAdapter(List mData) { 
  this.mData = mData; 
 } 
 //返回视图的数量 
 @Override 
 public int getCount() { 
  return mData.size(); 
 } 
  
 @Override 
 public boolean isViewFromObject(View arg0, Object arg1) { 
  return arg0 == arg1; 
 } 
 
 //销毁图片 
 @Override 
 public void destroyItem(ViewGroup container, int position, Object object) { 
  container.removeView(mData.get(position)); 
 } 
  
 //添加图片 
 @Override 
 public Object instantiateItem(ViewGroup container, int position) { 
  container.addView(mData.get(position)); 
  return mData.get(position); 
 } 
  
} 

MainActivity.java

package cn.edu.huse.banner_re; 
 
import java.util.ArrayList; 
import java.util.List; 
 
import org.json.JSONArray; 
import org.json.JSONObject; 
 
import android.app.Activity; 
import android.graphics.Bitmap; 
import android.os.Bundle; 
import android.os.Handler; 
import android.support.v4.view.ViewPager; 
import android.support.v4.view.ViewPager.OnPageChangeListener; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.view.View.OnClickListener; 
import android.widget.ArrayAdapter; 
import android.widget.ImageView; 
import android.widget.LinearLayout; 
import android.widget.ListView; 
import android.widget.RadioButton; 
import cn.edu.huse.banner_re.adapter.MyViewPagerAdapter; 
import cn.edu.huse.banner_re.util.ImageLoader; 
import cn.edu.huse.banner_re.util.ImageLoader.OnImageLoadListener; 
import cn.edu.huse.banner_re.util.JSONLoader; 
import cn.edu.huse.banner_re.util.JSONLoader.OnJSONLoadListener; 
 
public class MainActivity extends Activity implements OnClickListener{ 
 
 public static final String URL_GIFT = "http://www.1688wan.com/majax.action&#63;method=getGiftList&pageno=1"; 
 public static final String URL_BASE = "http://www.1688wan.com"; 
 private ListView mLv; 
 //放置圆点图片的布局 
 private LinearLayout mLayout; 
 private ViewPager mPager; 
 //保存viewpager上图片的集合 
 private List mImageViews; 
 //保存圆点图片的集合 
 private List mDotViews; 
 //当前图片 
 private ImageView mDotView; 
 //当前下标 
 private int mIndex; 
 private Handler mHandler = new Handler(); 
 
 @Override 
 protected void onCreate(Bundle savedInstanceState) { 
  super.onCreate(savedInstanceState); 
  setContentView(R.layout.activity_main); 
  //初始化viewpager 
  initViewPager(); 
 } 
 
 private void initViewPager() { 
  new JSONLoader().loadJSON(URL_GIFT, new OnJSONLoadListener() { 
   @Override 
   public void onJSONLoadComplete(String json) { 
    //得到图片的地址 
    List list = josnPare(json); 
    //初始化主控件 
    initView(); 
    //将图片显示到viewpager中 
    initImageViews(list); 
    //为ViewPager设置适配器 
    mPager.setAdapter(new MyViewPagerAdapter(mImageViews)); 
    //加载圆点图片 
    initDot(mImageViews.size()); 
    //实现图片的轮播 
    mPager.postDelayed(new Runnable() { 
     @Override 
     public void run() { 
      //下标自动++ 
      mIndex++; 
      //当下标到最后时,就重新来过 
      if(mIndex >= mImageViews.size()){ 
       mIndex = 0; 
      } 
      //设置图片 
      mPager.setCurrentItem(mIndex); 
      //重复调用 
      mHandler.postDelayed(this, 1500); 
     } 
    }, 1500); 
    //添加页码滑动的监听,实现圆点图片的切换 
    mPager.setOnPageChangeListener(new OnPageChangeListener() { 
      
     //页选中后调用 
     @Override 
     public void onPageSelected(int arg0) { 
      //改变原来的圆点图片的状态 
      mDotView.setEnabled(true); 
      //更新当前的圆点图片 
      mDotView = mDotViews.get(arg0); 
      //将当前选中的圆点设为选中状态 
      mDotView.setEnabled(false); 
      //更新下标 
      mIndex = arg0; 
     } 
      //滑动中途调用 
     @Override 
     public void onPageScrolled(int arg0, float arg1, int arg2) { 
       
     } 
      //页面滑动状态修改 
     @Override 
     public void onPageScrollStateChanged(int arg0) { 
       
     } 
    }); 
   } 
  }); 
 } 
  
 /**获取圆点图片函数 
  * @param count viewpager上图片的数量 
  */ 
 private void initDot(int count){ 
  mDotViews = new ArrayList(); 
  LinearLayout.LayoutParams params = new LinearLayout.LayoutParams( 
    LinearLayout.LayoutParams.WRAP_CONTENT, 
    LinearLayout.LayoutParams.WRAP_CONTENT); 
  //设置边距 
  params.setMargins(5, 0, 5, 0); 
  for(int i = 0; i  list) { 
  mImageViews = new ArrayList(); 
  for(String str : list){ 
   final ImageView imageView = new ImageView(this); 
   //设置默认图片 
   imageView.setImageResource(R.drawable.ic_launcher); 
   new ImageLoader().loadImage(URL_BASE+str, new OnImageLoadListener() { 
     
    @Override 
    public void onImageLoadComplete(String url, Bitmap bitmap) { 
     if(bitmap != null){ 
      imageView.setImageBitmap(bitmap); 
     } 
    } 
   }); 
   //将ImageView保存到集合中 
   mImageViews.add(imageView); 
  } 
   
 } 
 /** 
  * JSON解析获取图片的地址 
  * @param url 
  * @return 
  */ 
 private List josnPare(String url){ 
  List list = new ArrayList(); 
  try { 
   JSONObject jobj = new JSONObject(url); 
   JSONArray array = jobj.getJSONArray("ad"); 
   for(int i = 0; i  mList = new ArrayList(); 
  for(int i = 0; i <20; i++){ 
   mList.add("条目--"+i); 
  } 
  //创建适配器 
  ArrayAdapter mAdapter = new ArrayAdapter(this, 
    android.R.layout.simple_list_item_1, 
    android.R.id.text1, 
    mList); 
  //设置头部视图 
  mLv.addHeaderView(view); 
  //设置适配器 
  mLv.setAdapter(mAdapter); 
  /*//圆点图片布局 
  mLayout = (LinearLayout)findViewById(R.id.layout);*/ 
 } 
  
  
 /** 
  * 圆点图片的监听事件 
  */ 
 @Override 
 public void onClick(View arg0) { 
  //获取该圆点图片的位置 
  int index = Integer.parseInt(arg0.getTag().toString()); 
  //将viewpager的图片显示成下标为index的图片 
  mPager.setCurrentItem(index); 
  //将原来的设置成默认值 
  mDotView.setEnabled(true); 
  //保存新的值 
  mDotView = (ImageView) arg0; 
  //将新的值改变成false 
  mDotView.setEnabled(false); 
  //更新下标 
  mIndex = index; 
 } 
 
} 

注意:因为这里用到了json解析,需要用到联网操作,一定要写上上网的权限:

运行效果:

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


推荐阅读
  • 优化ListView性能
    本文深入探讨了如何通过多种技术手段优化ListView的性能,包括视图复用、ViewHolder模式、分批加载数据、图片优化及内存管理等。这些方法能够显著提升应用的响应速度和用户体验。 ... [详细]
  • 本文探讨了 RESTful API 和传统接口之间的关键差异,解释了为什么 RESTful API 在设计和实现上具有独特的优势。 ... [详细]
  • 本文详细介绍了Java编程语言中的核心概念和常见面试问题,包括集合类、数据结构、线程处理、Java虚拟机(JVM)、HTTP协议以及Git操作等方面的内容。通过深入分析每个主题,帮助读者更好地理解Java的关键特性和最佳实践。 ... [详细]
  • 360SRC安全应急响应:从漏洞提交到修复的全过程
    本文详细介绍了360SRC平台处理一起关键安全事件的过程,涵盖从漏洞提交、验证、排查到最终修复的各个环节。通过这一案例,展示了360在安全应急响应方面的专业能力和严谨态度。 ... [详细]
  • RecyclerView初步学习(一)
    RecyclerView初步学习(一)ReCyclerView提供了一种插件式的编程模式,除了提供ViewHolder缓存模式,还可以自定义动画,分割符,布局样式,相比于传统的ListVi ... [详细]
  • 网络运维工程师负责确保企业IT基础设施的稳定运行,保障业务连续性和数据安全。他们需要具备多种技能,包括搭建和维护网络环境、监控系统性能、处理突发事件等。本文将探讨网络运维工程师的职业前景及其平均薪酬水平。 ... [详细]
  • 基于KVM的SRIOV直通配置及性能测试
    SRIOV介绍、VF直通配置,以及包转发率性能测试小慢哥的原创文章,欢迎转载目录?1.SRIOV介绍?2.环境说明?3.开启SRIOV?4.生成VF?5.VF ... [详细]
  • 解决JAX-WS动态客户端工厂弃用问题并迁移到XFire
    在处理Java项目中的JAR包冲突时,我们遇到了JaxWsDynamicClientFactory被弃用的问题,并成功将其迁移到org.codehaus.xfire.client。本文详细介绍了这一过程及解决方案。 ... [详细]
  • 最近团队在部署DLP,作为一个技术人员对于黑盒看不到的地方还是充满了好奇心。多次咨询乙方人员DLP的算法原理是什么,他们都以商业秘密为由避而不谈,不得已只能自己查资料学习,于是有了下面的浅见。身为甲方,虽然不需要开发DLP产品,但是也有必要弄明白DLP基本的原理。俗话说工欲善其事必先利其器,只有在懂这个工具的原理之后才能更加灵活地使用这个工具,即使出现意外情况也能快速排错,越接近底层,越接近真相。根据DLP的实际用途,本文将DLP检测分为2部分,泄露关键字检测和近似重复文档检测。 ... [详细]
  • 探讨在循环中调用$.post()时,回调函数为何会在循环结束后才开始执行,并提供解决方案和优化建议。 ... [详细]
  • 探讨如何真正掌握Java EE,包括所需技能、工具和实践经验。资深软件教学总监李刚分享了对毕业生简历中常见问题的看法,并提供了详尽的标准。 ... [详细]
  • 本文介绍如何使用布局文件在Android应用中排列多行TextView和Button,使其占据屏幕的特定比例,并提供示例代码以帮助理解和实现。 ... [详细]
  • 本文探讨了在Windows Server 2008环境下配置Tomcat使用80端口时遇到的问题,包括端口被占用、多项目访问失败等,并提供详细的解决方法和配置建议。 ... [详细]
  • 本文详细解析了如何使用Python的urllib模块发起POST请求,并通过实例展示如何爬取百度翻译的翻译结果。 ... [详细]
  • 本文详细介绍了Java Web应用程序中的过滤器(Filter)功能,包括其作用、实现方式及配置方法。过滤器可以在请求到达目标资源之前对其进行预处理,并在响应返回给客户端之前进行后处理。 ... [详细]
author-avatar
是冉冉升起的冉啊
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有