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文件下

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android" >
 <item android:state_enabled="true">
  <shape android:shape="oval">
   <size android:width="5dp" android:height="5dp"/>
   <solid android:color="#fff"/>
  </shape>
 </item>
  <item android:state_enabled="false">
  <shape android:shape="oval">
   <size android:width="5dp" android:height="5dp"/>
   <solid android:color="#8EE5EE"/>
  </shape>
 </item> 

</selector>

布局文件:

activity_main.xml

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
 xmlns:tools="http://schemas.android.com/tools"
 android:layout_width="match_parent"
 android:layout_height="match_parent"
 tools:context=".MainActivity" > 

 <ListView
  android:layout_width="match_parent"
  android:layout_height="match_parent"
  android:id="@+id/lv_list" />
</RelativeLayout>

activity_banner.xml

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
 xmlns:tools="http://schemas.android.com/tools"
 android:layout_width="match_parent"
 android:layout_height="match_parent"
 tools:context=".MainActivity" > 

 <android.support.v4.view.ViewPager
  android:id="@+id/vp_image"
  android:layout_width="wrap_content"
  android:layout_height="150dp"
  android:layout_gravity="center" />
 <LinearLayout
  android:layout_width="match_parent"
  android:layout_height="40dp"
  android:id="@+id/layout"
  android:layout_gravity="bottom"
  android:gravity="center"
  android:orientation="horizontal"
  ></LinearLayout>
</FrameLayout>

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<String,Void,ImageLoadTask.UrlAndBitmap>{ 

  @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<String,Void,String>{ 

  @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<ImageView> mData; 

 public MyViewPagerAdapter(List<ImageView> 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?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<ImageView> mImageViews;
 //保存圆点图片的集合
 private List<ImageView> 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<String> 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<ImageView>();
  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 < count; i++){
   ImageView image = new ImageView(this);
   //设置圆点图片
   image.setImageResource(R.drawable.mydot);
   //设置图片的位置,方便后面的取值
   image.setTag(i);
   //设置监听
   image.setOnClickListener(this);
   //添加到布局中
   mLayout.addView(image, params);
   //将圆点图片保存到集合中
   mDotViews.add(image);
  }
  mDotView = mDotViews.get(0);
  mDotView.setEnabled(false);
 } 

 /**
  *显示图片的函数
  */
 private void initImageViews(List<String> list) {
  mImageViews = new ArrayList<ImageView>();
  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<String> josnPare(String url){
  List<String> list = new ArrayList<String>();
  try {
   JSONObject jobj = new JSONObject(url);
   JSONArray array = jobj.getJSONArray("ad");
   for(int i = 0; i < array.length(); i++){
    JSONObject obj = (JSONObject) array.get(i);
    list.add(obj.getString("iconurl"));
   }
  } catch (Exception e) {
   e.printStackTrace();
  }
  return list;
 } 

 /**
  * 初始化控件
  */
 private void initView() {
  //找到控件
  mLv = (ListView) findViewById(R.id.lv_list); 

  View view = LayoutInflater.from(this).inflate(R.layout.activity_banner, null);
  mPager = (ViewPager)view.findViewById(R.id.vp_image);
  //圆点图片布局
  mLayout = (LinearLayout)view.findViewById(R.id.layout);
  //模拟数据
  List<String> mList = new ArrayList<String>();
  for(int i = 0; i < 20; i++){
   mList.add("条目--"+i);
  }
  //创建适配器
  ArrayAdapter<String> mAdapter = new ArrayAdapter<String>(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解析,需要用到联网操作,一定要写上上网的权限:

运行效果:

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

(0)

相关推荐

  • Android使用ViewPager加载图片和轮播视频

    作为Android基础组件之一,大家对viewpager已经很熟悉了,网上也有很多使用viewpager来加载图片的案例.但是像微信那样点击图片,可以轮播显示图片和视频的例子却没找到.正巧项目中有需求,可以就花时间写了下,现在给一下核心代码,希望对有此需求的同学们起一个抛砖引玉的作用.话不多说了,上代码: 以下是initData的代码 public void initData() { //把聊天界面的图片和视频找出来,并加到数组中,并在 //并根据传进来的position来找到视频或图片在数组中

  • Android使用ViewPager实现导航

    首先先了解ViewPager实现的出效果是能够使视图左右滑动. ViewPager在XML文件中的声明和其他一些控件的声明有点儿不一样 而android.support.v4.view是Android界面特殊效果的第三方加载的jar包,能够向下兼容. <android.support.v4.view.ViewPager ... ... > </android.support.v4.view.ViewPager> 加载显示的页卡:需要将layout布局文件转型为View对象 (1)

  • ViewPager判断是向左划还是右划的实例

    实例如下: //记录上一次滑动的positionOffsetPixels值 private int lastValue = -1; private boolean isLeft = true; mViewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() { @Override public void onPageScrolled(int position, float positionOffset, int po

  • android ViewPager实现滑动翻页效果实例代码

    实现ViewPager的滑动翻页效果可以使用ViewPager的setPageTransformer方法,如下: import android.content.Context; import android.support.v4.view.ViewPager; import android.util.AttributeSet; import android.view.View; public class ReadViewPager extends ViewPager { public ReadV

  • Android ViewPager撤消左右滑动切换功能实现代码

    最近做项目要求某种情况下ViewPager不能滑动,那么我们只需要重写这个方法就可以禁止ViewPager滑动.下面通过本文给大家ViewPager取消左右滑动切换功能的实例代码,具体代码如下所示: IndexViewPager.Java: <span style="background-color: rgb(255, 255, 255);">import android.content.Context; import android.support.v4.view.Vie

  • android使用ViewPager实现轮播效果

    ViewPager:一个可以实现视图左右滑动切换的控件. ViewPager的基本使用: ViewPager的视图需要通过PagerAdapter来实现显示. PagerAdapter的主要方法: ● getCount 视图的数量 ● instantiateItem 添加视图 ● destroyItem 销毁视图 ● isViewFromObject 是否由对象创建视图 ViewPager的常用方法: setAdapter 设置适配器 addOnPageChangeListener 监听页面切换

  • Android 使用ViewPager实现轮播图效果

    写这篇文章只是对今天所学的知识进行加深印象,对ViewPager的一些处理,比如适配器和各个方法的作用等. 先看效果图 这里我是在xml中写的圆点 Drawable文件夹下的xml代码: Shape_yes.xml: <?xml version="1.0" encoding="utf-8"?> <shape xmlns:android="http://schemas.android.com/apk/res/android">

  • android viewpager实现轮播效果

    本文是基于ViewPager实现的无限自动轮播banner,供大家参考,具体内容如下 分为四步去实现: 第一步是有限手动轮播: 第二步是无限轮播: 第三步是自动轮播: 第四步是指示器适配 第一步:有限手动轮播实现 布局: <androidx.viewpager.widget.ViewPager     android:id="@+id/banner"     android:layout_width="match_parent"     android:lay

  • Android实现广告图片轮播效果

    本文实例介绍了Android广告轮播图效果实现方法,分享给大家供大家参考,具体内容如下 首先看下一下布局文件: <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:

  • Android ViewPager实现图片轮播效果

    在app中图片的轮播显示可以说是非常常见的实现效果了,其实现原理不过是利用ViewPager,然后利用handler每隔一定的时间将ViewPager的currentItem设置为当前item的position+1即可.先来看看效果图吧: 就是实现这样的一个轮播广告的效果. 因为这个是自己为了练习仿照某旅游类App做的,所以这里的数据是使用抓包工具抓取的,准备数据等工作就不在这里赘述了,反正数据的添加大体都是相同的.我的思路是这样的,从网络上实时的获取数据(当然你也可以将数据写死),然后通过网络

  • Android 中使用 ViewPager实现屏幕页面切换和页面轮播效果

    之前关于如何实现屏幕页面切换,写过一篇博文<Android中使用ViewFlipper实现屏幕切换>,相比ViewFlipper,ViewPager更适用复杂的视图切换,而且Viewpager有自己的adapter,这也让其适应复杂对象,实现数据的动态加载. ViewPager是谷歌官方给我们提供的一个兼容低版本安卓设备的软件包,里面包囊了只有在安卓3.0以上可以使用的api.而viewpager就是其中之一,利用它,我们可以做很多事情,从最简单的导航,到页面菜单等等. 下面我们就展示下Vie

  • Android 使用ViewPager实现左右循环滑动及轮播效果

    ViewPager是一个常用的Android组件,不过通常我们使用ViewPager的时候不能实现左右无限循环滑动,在滑到边界的时候会看到一个不能翻页的动画,可能影响用户体验.此外,某些区域性的ViewPager(例如展示广告或者公告之类的ViewPager),可能需要自动轮播的效果,即用户在不用滑动的情况下就能够看到其他页面的信息. 循环滑动效果的实现:PagerAdapter 我们知道ViewPager自带的滑动效果非常出色,因此我们基本不需要处理这个滑动,只处理内容的显示.而内容的显示是由

  • Android ViewPager实现轮播图效果

    先上一张效果图: 说到ViewPager实现轮播图效果,那么肯定会用到PagerAdapter,下面先介绍下这个类. PagerAdapter简介 PagerAdapter是Android.support.v4包中的类,是一个抽象类,直接继承于Object,导入包android.support.v4.view.PagerAdapter即可使用. PagerAdapter主要是viewpager的适配器,而viewPager则也是在android.support.v4扩展包中新添加的一个强大的控件

  • Android实现viewpager实现循环轮播效果

    在网上看到很多利用viewpager实现轮播都是通过设置一个很大的值,让viewpager开始显示在这个数值区间的中间,但这种轮播个人感觉不是真正的轮播,因此自己实现了一个轮播的效果.大致思路是这样的,假如有5张图adcde是要轮播展示的,这时创建一个新的集合eadcdea,然后再让viewpager设置当前展示第一张图,也就是显示a.这样当往左滑时显示的是e,此时设置viewpager.setCurrentItem(5),当右滑到e的时候在往右滑,此时设置viewpager.setCurren

  • Android UI实现广告Banner轮播效果

    本篇博客要分享的一个效果是实现广告Banner轮播效果,这个效果也比较常见,一些视频类应用就经常有,就拿360影视大全来举例吧: 用红框框住的那个效果就是小巫今天要分享的,先来思考一下会用到什么控件?有什么用户体验? 控件我们可能一下子就可以想到的自然是ViewPager,没错!用到的就是ViewPager,那么它会有什么用户体验呢,它可能有以下几个体验: 1. 间隔不停的切换图片,指示器也跟着变 2. 点击图片可以跳转到指定的页面 如何实现? 布局开始着手 /BannerAutoScrollD

随机推荐