很多App都有这种效果,特别一些电商类的App,顶部每隔几秒钟会向右翻页显示下张图片,用来作推广或者内容展示用的。今天来简单地模仿一下,还自带一个自动跳动的小功能(底部有几个小点,图片移动的时候,点的状态也在变化),用定时器来实现不难。

import java.util.ArrayList;
import java.util.List;

import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.os.SystemClock;
import android.support.v4.view.PagerAdapter;
import android.support.v4.view.ViewPager;
import android.support.v4.view.ViewPager.OnPageChangeListener;
import android.util.Log;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.LinearLayout.LayoutParams;
import android.widget.TextView;

public class MainActivity extends Activity implements OnPageChangeListener {

	protected static final String TAG = "MainActivity";
	private List<ImageView> imageViewList;
	private ViewPager mViewPager;
	private final int[] imageResIDs = {
			R.drawable.a,
			R.drawable.b,
			R.drawable.c,
			R.drawable.d,
			R.drawable.e
	};
	private final String[] imageDescriptions = {
			"巩俐不低俗,我就不能低俗",
			"扑树又回来啦!再唱经典老歌引万人大合唱",
			"揭秘北京电影如何升级",
			"乐视网TV版大派送",
			"热血屌丝的反杀"
	};
	private TextView tvImageDescription;	// 图片描述
	private LinearLayout llPointGroup;		// 点控件的组
	private int previousPosition = 0;		// viewpager选中的前一个position
	private boolean isStop = false;	// 控制循环的子线程是否停止

	private Handler handler = new Handler(){

		@Override
		public void handleMessage(Message msg) {
			super.handleMessage(msg);

			mViewPager.setCurrentItem(mViewPager.getCurrentItem() + 1);
		}
	};

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        initView();

        new Thread(new Runnable() {

			@Override
			public void run() {
				// 每两秒钟向主线程发送一条消息, 切换viewpager的界面
				while(!isStop) {
					SystemClock.sleep(2000);

					handler.sendEmptyMessage(0);
				}
				Log.i(TAG, "循环线程停止了");
			}}).start();
    }

    @Override
    protected void onDestroy() {
    	isStop = true;
    	super.onDestroy();
    }

	private void initView() {
		mViewPager = (ViewPager) findViewById(R.id.viewpager);
		llPointGroup = (LinearLayout) findViewById(R.id.ll_point_group);
		tvImageDescription = (TextView) findViewById(R.id.tv_image_description);

		imageViewList = new ArrayList<ImageView>();

		ImageView iv;
		View pointView;
		LayoutParams params;
		for (int i = 0; i < imageResIDs.length; i++) {
			iv = new ImageView(this);
			iv.setBackgroundResource(imageResIDs[i]);
			imageViewList.add(iv);

			// 根据图片添加点
			pointView = new View(this);
			params = new LayoutParams(5, 5);
			params.leftMargin = 5;
			pointView.setLayoutParams(params);
			pointView.setEnabled(false);
			pointView.setBackgroundResource(R.drawable.point_bg);
			llPointGroup.addView(pointView);
		}

		MyPagerAdapter mAdapter = new MyPagerAdapter();
		mViewPager.setAdapter(mAdapter);
		mViewPager.setOnPageChangeListener(this);

		int item = (Integer.MAX_VALUE / 2) - ((Integer.MAX_VALUE / 2) % imageViewList.size());
		mViewPager.setCurrentItem(item);		// 设置当前选中的item的position

		tvImageDescription.setText(imageDescriptions[previousPosition]);
		llPointGroup.getChildAt(previousPosition).setEnabled(true);	// 第一点被选中
	}

	class MyPagerAdapter extends PagerAdapter {

		@Override
		public int getCount() {
			return Integer.MAX_VALUE;
		}

		/**
		 * 移动的对象和进来的对象如果是同一个就返回true, 代表复用view对象
		 * false 使用object对象
		 */
		@Override
		public boolean isViewFromObject(View arg0, Object arg1) {
			return arg0 == arg1;
		}

		/**
		 * 需要销毁的对象的position传进来
		 */
		@Override
		public void destroyItem(ViewGroup container, int position, Object object) {
			// 移除掉指定position的对象
			mViewPager.removeView(imageViewList.get(position % imageViewList.size()));
		}

		/**
		 * 加载position位置的view对象
		 */
		@Override
		public Object instantiateItem(ViewGroup container, int position) {
			// 添加指定position的对象
			mViewPager.addView(imageViewList.get(position % imageViewList.size()));
			return imageViewList.get(position % imageViewList.size());
		}
	}

	@Override
	public void onPageScrollStateChanged(int arg0) {
		// TODO Auto-generated method stub

	}

	@Override
	public void onPageScrolled(int arg0, float arg1, int arg2) {
		// TODO Auto-generated method stub

	}

	/**
	 * 当viewpager页面切换时回调
	 * @param position 就是当前显示的page页
	 */
	@Override
	public void onPageSelected(int position) {
		tvImageDescription.setText(imageDescriptions[position % imageViewList.size()]);
		llPointGroup.getChildAt(position % imageViewList.size()).setEnabled(true);
		llPointGroup.getChildAt(previousPosition).setEnabled(false);

		previousPosition = position % imageViewList.size();
	}
}

ViewPager实现图片轮翻效果的更多相关文章

  1. Android实现图片轮显效果——自定义ViewPager控件

    一.问题概述 使用ViewPager控件实现可横向翻页.水平切换图片等效果,但ViewPager需要手动滑动才能切换页面,图片轮显效果的效果本质上就是在ViewPager控件的基础上让它能自动的进行切 ...

  2. 通过ViewPager 实现图片轮播

    通过ViewPager 实现图片轮播 首先来个效果图 布局文件: LinearLayout 用来存放下方的几个小白点. <?xml version="1.0" encodin ...

  3. jQuery个性化图片轮播效果

    jQuery个性化图片轮播效果 购物产品展示:图片轮播器<效果如下所示> 思路说明: 每隔一段时间,实现图片的自动切换及选项卡选中效果,鼠标划入图片动画停止,划出或离开动画开始 两个区域: ...

  4. CSS3图片轮播效果

    原文:CSS3图片轮播效果 在网页中用到图片轮播效果,单纯的隐藏.显示,那再简单不过了,要有动画效果,如果是自己写的话(不用jquery等),可能要费点时间.css3的出现,让动画变得不再是问题,而且 ...

  5. js实现淘宝首页图片轮播效果

    原文:http://ce.sysu.edu.cn/hope2008/Education/ShowArticle.asp?ArticleID=10585 <!DOCTYPE html> &l ...

  6. 超实用的JavaScript代码段 Item3 --图片轮播效果

    图片轮播效果 图片尺寸 统一设置成:490*170px; 一.页面加载.获取整个容器.所有放数字索引的li及放图片列表的ul.定义放定时器的变量.存放当前索引的变量index 二.添加定时器,每隔2秒 ...

  7. JQ 实现轮播图(3D旋转图片轮播效果)

    轮播图效果如下: 代码: <!DOCTYPE html> <html xmlns="/www.w3.org/1999/xhtml"> <head> ...

  8. ios图片轮播效果

    代码地址如下:http://www.demodashi.com/demo/11959.html ImageCarousel 简单封装的图片轮播器 内存过大由于我加载的图片分辨率较高(4k) 文件目录 ...

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

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

随机推荐

  1. Hadoop源码如何查看

    如何查看hadoop源码 1解压hadoop安装压缩文件成为文件夹,再进入解压后的文件夹下的src文件夹,选中core,hdfs,mapred三个文件夹

  2. python全栈开发从入门到放弃之文件处理

    一.文件处理流程 1.打开文件,得到文件句柄并赋值给一个变量 2.通过句柄对文件进行操作 3.关闭文件 事例文件内容 [一棵开花的树] 如何让你遇见我 在我最美丽的时刻 为这 我已在佛前求了五百年 求 ...

  3. Matplot相关(二)——统计图

    Matplotlib:其能够支持所有的2D作图和部分3D作图.能通过交互环境做出印刷质量的图像. ————————缩写定义———————— import matplot.pyplot as plt — ...

  4. MiniGUI 显示中文

    修改/usr/local/etc/MiniGUI.cfg # The first system font must be a logical font using RBF device font.[s ...

  5. 对 Java Integer.valueOf() 的一些了解

    从一道选择题开始 分析 选项A   选项A中比较的是i01和i02,Integer i01=59这里涉及到自动装箱过程,59是整型常量,经包装使其产生一个引用并存在栈中指向这个整型常量所占的内存,这时 ...

  6. Chrome浏览器快捷键

    Chrome窗口和标签页快捷键:Ctrl+N 打开新窗口 Ctrl+T 打开新标签页 Ctrl+Shift+N 在隐身模式下打开新窗口 Ctrl+O,然后选择文件 在谷歌浏览器中打开计算机上的文件 按 ...

  7. 20145201《Java程序设计》第1次实验报告

    实验内容 一.命令行下java程序开发 1.建立Code目录,输入mkdir 20145201命令建立实验目录,并使用dir命令查看目录建立情况. 运行结果如图 2.进入实验目录,输入mkdir ex ...

  8. 关于 Content-Type:application/x-www-form-urlencoded 和 Content-Type:multipart/related(转)

    最近项目中用到的一个是用一个页面接收c程序post过来的一断字符串..总接收不到值... 我用C#写一个测试可以正常接收到值. 最后抓包比较 区别只是 Content-Type:application ...

  9. redis入门笔记

    redis入门笔记 参考redis实战手册 1. Redis在windows下安装 下载地址:https://github.com/MSOpenTech/redis/tags 安装Redis 1.1. ...

  10. Oracle imp 导入数据出现 ORA-12560

    错误如下: D:\software\xfwebdb2015-05-11\autobackup>imp Import: Release 10.2.0.1.0 - Production on 星期三 ...