ViewPager实现图片轮翻效果
很多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实现图片轮翻效果的更多相关文章
- Android实现图片轮显效果——自定义ViewPager控件
一.问题概述 使用ViewPager控件实现可横向翻页.水平切换图片等效果,但ViewPager需要手动滑动才能切换页面,图片轮显效果的效果本质上就是在ViewPager控件的基础上让它能自动的进行切 ...
- 通过ViewPager 实现图片轮播
通过ViewPager 实现图片轮播 首先来个效果图 布局文件: LinearLayout 用来存放下方的几个小白点. <?xml version="1.0" encodin ...
- jQuery个性化图片轮播效果
jQuery个性化图片轮播效果 购物产品展示:图片轮播器<效果如下所示> 思路说明: 每隔一段时间,实现图片的自动切换及选项卡选中效果,鼠标划入图片动画停止,划出或离开动画开始 两个区域: ...
- CSS3图片轮播效果
原文:CSS3图片轮播效果 在网页中用到图片轮播效果,单纯的隐藏.显示,那再简单不过了,要有动画效果,如果是自己写的话(不用jquery等),可能要费点时间.css3的出现,让动画变得不再是问题,而且 ...
- js实现淘宝首页图片轮播效果
原文:http://ce.sysu.edu.cn/hope2008/Education/ShowArticle.asp?ArticleID=10585 <!DOCTYPE html> &l ...
- 超实用的JavaScript代码段 Item3 --图片轮播效果
图片轮播效果 图片尺寸 统一设置成:490*170px; 一.页面加载.获取整个容器.所有放数字索引的li及放图片列表的ul.定义放定时器的变量.存放当前索引的变量index 二.添加定时器,每隔2秒 ...
- JQ 实现轮播图(3D旋转图片轮播效果)
轮播图效果如下: 代码: <!DOCTYPE html> <html xmlns="/www.w3.org/1999/xhtml"> <head> ...
- ios图片轮播效果
代码地址如下:http://www.demodashi.com/demo/11959.html ImageCarousel 简单封装的图片轮播器 内存过大由于我加载的图片分辨率较高(4k) 文件目录 ...
- axure 动态面板实现图片轮播效果(淘宝)
淘宝中经常可以看到店铺中的图片轮播效果,本经验将通过axure7.0实现 工具/原料 axure7.0 方法/步骤 下载需要轮播的图片 将图片引入至axure中,将引入的第一张图片转为 ...
随机推荐
- SSH 公钥检查
SSH 公钥检查是一个重要的安全机制,可以防范中间人劫持等黑客攻击.但是在特定情况下,严格的 SSH 公钥检查会破坏一些依赖 SSH 协议的自动化任务,就需要一种手段能够绕过 SSH 的公钥检查. 首 ...
- 使用反射实现 webdriver page 类
这个类的目的是为了简化page类的实例化,只需要定义public page成员变量 然后再 启动driver后 通过反射实例化page 后面可以直接点出page实例 package crazy.sel ...
- iOS学习之应用偏好设置
如今,即便是最简单的计算机程序也会包含一个偏好设置窗口,用户可以在其中设置应用专属的选项.在MAC OS X中,Preferences...菜单通常位于应用菜单中.选择该菜单项会弹出一个窗口,用户可以 ...
- Part1.1 、RabbitMQ 操作使用
本节目录: 一.最基本的生产者消费者二.acknowledgment 消息不丢失的方法. 三.durable 消息不丢失 (消息持久化) 四.消息获取顺序 RabbitMQ安装. (1.1).ce ...
- python16_day17【Django_session、ajax】
一.Session 1.settings.py SESSION_ENGINE = 'django.contrib.sessions.backends.db' # 引擎(默认) SESSION_COOK ...
- python16_day07【Socket网络编程】
一.简介 1.理解C/S,B/S 2.IOS七层模型(http://www.cnblogs.com/linhaifeng/articles/5937962.html) 二.什么是Socket 我们看看 ...
- mysql的-F与master-data理解(一个小型的big-log恢复)
例子: 使用mysqlbin-log恢复,有两种情况,一个是停数据库,一个是不停 在不停数据库的情况下,为了防止新的写入,需要将bin-log切割,然后新的数据会保存在新的bin-log里面 在此之前 ...
- python数据可视化、数据挖掘、机器学习、深度学习 常用库、IDE等
一.可视化方法 条形图 饼图 箱线图(箱型图) 气泡图 直方图 核密度估计(KDE)图 线面图 网络图 散点图 树状图 小提琴图 方形图 三维图 二.交互式工具 Ipython.Ipython not ...
- python3 requests模块
一.Requests用法: 1.发送请求: 1).请求类型:req_obj = requests.get("https://www.baidu.com")requests支持多种请 ...
- ASP.NET MVC CheckBoxFor的int to bool
当我们使用CheckBoxFor类型需要使用bool ,可以将 int转换成bool <div class="form-group"> <label class= ...