Android实现图片轮显效果——自定义ViewPager控件
一、问题概述 |
使用ViewPager控件实现可横向翻页、水平切换图片等效果,但ViewPager需要手动滑动才能切换页面,图片轮显效果的效果本质上就是在ViewPager控件的基础上让它能自动的进行切换,所以实现图片轮显步骤如下:
1、 扩展ViewPager自定义一个MyScrollImageView类
2、 为MyScrollImageView定义适配器,装载图片信息
3、 定义图片滑动动画时间控制类
接下来我们就一步步实现下图案例:
二、实现套路 |
1、为自定义ViewPager控件编写适配器
我们先为我们的自定义ViewPager控件编写一个适配器,用于加载要轮显的图片,这个和使用ViewPager控件一样都要为适配器控件定义适配器
- // 适配器
- public class MyPagerAdapter extends PagerAdapter {
- private Activity mActivity; // 上下文
- private List<View> mListViews; // 图片组
- public MyPagerAdapter(){
- }
- public MyPagerAdapter(Activity mActivity,List<View> mListViews){
- this.mActivity=mActivity;
- this.mListViews=mListViews;
- }
- public int getCount() {
- if (mListViews.size() == 1) {// 一张图片时不用流动
- return mListViews.size();
- }
- return Integer.MAX_VALUE;
- }
- /**
- 返回List中的图片元素装载到控件中
- */
- public Object instantiateItem(View v, int i) {
- if (((ViewPager) v).getChildCount() == mListViews.size()) {
- ((ViewPager) v)
- .removeView(mListViews.get(i % mListViews.size()));
- }
- ((ViewPager) v).addView(mListViews.get(i % mListViews.size()), 0);
- return mListViews.get(i % mListViews.size());
- }
- public boolean isViewFromObject(View arg0, Object arg1) {
- return arg0 == (arg1);
- }
- public void destroyItem(ViewGroup view, int i, Object object) {
- view.removeView(mListViews.get(i%mListViews.size()));
- }
- }
2、自定义一个MyScrollImageView类
自定义一个MyScrollImageView类,主要扩展一个start(…)方法,该方法实现按时间间隔不断切换图片
- public class MyImgScroll extends ViewPager {
- Activity mActivity; // 上下文
- List<View> mListViews; // 图片组
- int mScrollTime = 0;
- Timer timer;
- int oldIndex = 0;
- int curIndex = 0;
- public MyImgScroll(Context context, AttributeSet attrs) {
- super(context, attrs);
- }
- /**
- * 开始广告滚动
- *
- * @param mainActivity
- * 显示广告的主界面
- * @param imgList
- * 图片列表, 不能为null ,最少一张
- * @param scrollTime
- * 滚动间隔 ,0为不滚动
- * @param ovalLayout
- * 圆点容器,可为空,LinearLayout类型
- * @param ovalLayoutId
- * ovalLayout为空时 写0, 圆点layout XMl
- * @param ovalLayoutItemId
- * ovalLayout为空时 写0,圆点layout XMl 圆点XMl下View ID
- * @param focusedId
- * ovalLayout为空时 写0, 圆点layout XMl 选中时的动画
- * @param normalId
- * ovalLayout为空时 写0, 圆点layout XMl 正常时背景
- */
- public void start(Activity mainActivity, List<View> imgList,
- int scrollTime, LinearLayout ovalLayout, int ovalLayoutId,
- int ovalLayoutItemId, int focusedId, int normalId) {
- mActivity = mainActivity;
- mListViews = imgList;
- mScrollTime = scrollTime;
- // 设置圆点
- setOvalLayout(ovalLayout, ovalLayoutId, ovalLayoutItemId, focusedId,
- normalId);
- this.setAdapter(new MyPagerAdapter(mActivity,mListViews));// 设置适配器
- if (scrollTime != 0 && imgList.size() > 1) {
- // 设置滑动动画时间 ,如果用默认动画时间可不用 ,反射技术实现
- new FixedSpeedScroller(mActivity).setDuration(this, 700);
- startTimer();
- // 触摸时停止滚动
- this.setOnTouchListener(new OnTouchListener() {
- public boolean onTouch(View v, MotionEvent event) {
- if (event.getAction() == MotionEvent.ACTION_UP) {
- startTimer();
- } else {
- stopTimer();
- }
- return false;
- }
- });
- }
- if (mListViews.size() > 1) {
- this.setCurrentItem((Integer.MAX_VALUE / 2)
- - (Integer.MAX_VALUE / 2) % mListViews.size());// 设置选中为中间/图片为和第0张一样
- }
- }
- // 设置圆点
- private void setOvalLayout(final LinearLayout ovalLayout, int ovalLayoutId,
- final int ovalLayoutItemId, final int focusedId, final int normalId) {
- if (ovalLayout != null) {
- LayoutInflater inflater=LayoutInflater.from(mActivity);
- for (int i = 0; i < mListViews.size(); i++) {
- ovalLayout.addView(inflater.inflate(ovalLayoutId, null));
- }
- //选中第一个
- ovalLayout.getChildAt(0).findViewById(ovalLayoutItemId)
- .setBackgroundResource(focusedId);
- this.setOnPageChangeListener(new OnPageChangeListener() {
- public void onPageSelected(int i) {
- curIndex = i % mListViews.size();
- //取消圆点选中
- ovalLayout.getChildAt(oldIndex).findViewById(ovalLayoutItemId)
- .setBackgroundResource(normalId);
- //圆点选中
- ovalLayout.getChildAt(curIndex).findViewById(ovalLayoutItemId)
- .setBackgroundResource(focusedId);
- oldIndex = curIndex;
- }
- public void onPageScrolled(int arg0, float arg1, int arg2) {
- }
- public void onPageScrollStateChanged(int arg0) {
- }
- });
- }
- }
- /**
- * 取得当明选中下标
- * @return
- */
- public int getCurIndex() {
- return curIndex;
- }
- /**
- * 停止滚动
- */
- public void stopTimer() {
- if (timer != null) {
- timer.cancel();
- timer = null;
- }
- }
- /**
- * 开始滚动
- */
- public void startTimer() {
- timer = new Timer();
- timer.schedule(new TimerTask() {
- public void run() {
- mActivity.runOnUiThread(new Runnable() {
- public void run() {
- MyImgScroll.this.setCurrentItem(MyImgScroll.this
- .getCurrentItem() + 1);//设置控件当前项(改变图片)
- }
- });
- }
- }, mScrollTime, mScrollTime);
- }
- }
3、定义图片滑动动画时间控制类
- package com.tianshicoffeeom.app.imgscroll;
- import java.lang.reflect.Field;
- import android.content.Context;
- import android.support.v4.view.ViewPager;
- import android.view.animation.Interpolator;
- import android.widget.Scroller;
- /**
- * 图片滑动动画时间控制类 , 如果采用默认时间可不用这个类 ,通过反射技术改变ViewPager的滑动时间
- *
- */
- public class FixedSpeedScroller extends Scroller {
- private Context context;
- private int mDuration = 500;
- public FixedSpeedScroller(Context context) {
- super(context);
- this.context=context;
- }
- public FixedSpeedScroller(Context context, Interpolator interpolator) {
- super(context, interpolator);
- this.context=context;
- }
- /**
- * 设置改变ViewPager的滑动时间
- * @param vp ViewPager 对象
- * @param time 时间
- */
- public void setDuration(ViewPager vp,int time) {
- try {
- Field field = ViewPager.class.getDeclaredField("mScroller");
- field.setAccessible(true);
- this.setmDuration(time);//设置翻动时间
- field.set(vp, this);
- } catch (Exception e) {
- }
- }
- @Override
- public void startScroll(int startX, int startY, int dx, int dy, int duration) {
- //System.out.println("startScroll1");
- super.startScroll(startX, startY, dx, dy, mDuration);
- }
- @Override
- public void startScroll(int startX, int startY, int dx, int dy) {
- //System.out.println("startScroll2");
- super.startScroll(startX, startY, dx, dy, mDuration);
- }
- public void setmDuration(int time) {
- mDuration = time;
- }
- public int getmDuration() {
- return mDuration;
- }
- }
4、编写MainActivity,测试组件
- public class MainActivity extends Activity {
- private MyImgScroll myPager; // 图片容器
- private LinearLayout ovalLayout; // 圆点容器
- private List<View> listViews; // 图片组
- @Override
- public void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.activity_main);
- myPager = (MyImgScroll) findViewById(R.id.myvp);
- ovalLayout = (LinearLayout) findViewById(R.id.vb);
- InitViewPager();//初始化图片
- //开始滚动
- myPager.start(this, listViews, 4000, ovalLayout,
- R.layout.ad_bottom_item, R.id.ad_item_v,
- R.drawable.dot_focused, R.drawable.dot_normal);
- }
- @Override
- protected void onRestart() {
- myPager.startTimer();
- super.onRestart();
- }
- @Override
- protected void onStop() {
- myPager.stopTimer();
- super.onStop();
- }
- /**
- * 初始化图片
- */
- private void InitViewPager() {
- listViews = new ArrayList<View>();
- int[] imageResId = new int[] { R.drawable.banner1, R.drawable. banner2,
- R.drawable. banner3, R.drawable.d, R.drawable. banner4 };
- for (int i = 0; i < imageResId.length; i++) {
- ImageView imageView = new ImageView(this);
- imageView.setOnClickListener(new OnClickListener() {
- public void onClick(View v) {// 设置图片点击事件
- Toast.makeText(MainActivity.this,
- "点击了:" + myPager.getCurIndex(), Toast.LENGTH_SHORT)
- .show();
- }
- });
- imageView.setImageResource(imageResId[i]);
- imageView.setScaleType(ScaleType.CENTER_CROP);
- listViews.add(imageView);
- }
- }
- }
5、MainActivity布局文件
- <LinearLayout 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"
- android:orientation="vertical" >
- <com.jereh.view. MyScrollImageView
- android:id="@+id/myvp"
- android:layout_width="fill_parent"
- android:layout_height="120dp" />
- <LinearLayout
- android:id="@+id/vb"
- android:layout_width="match_parent"
- android:layout_height="10dp"
- android:layout_marginTop="3dip"
- android:gravity="center"
- android:orientation="horizontal" >
- </LinearLayout>
- </LinearLayout>
完!
出处:http://www.cnblogs.com/jerehedu/
本文版权归烟台杰瑞教育科技有限公司和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
Android实现图片轮显效果——自定义ViewPager控件的更多相关文章
- 【Android】带底部指示的自定义ViewPager控件
在项目中经常需要使用轮转广告的效果,在android-v4版本中提供的ViewPager是一个很好的工具,而一般我们使用Viewpager的时候,都会选择在底部有一排指示物指示当前显示的是哪一个pag ...
- Android View体系(十)自定义组合控件
相关文章 Android View体系(一)视图坐标系 Android View体系(二)实现View滑动的六种方法 Android View体系(三)属性动画 Android View体系(四)从源 ...
- android之视频播放系统VideoView和自定义VideoView控件的应用
Android播放视频,包含系统自带VideoView控件,和自定义VideoView控件,可全屏播放,案例包含了本地视频和网络视频. 1:自定义VideoView控件 2:布局代码 3:Activi ...
- xamarin.Android ImageView 图片圆角(自定义属性、扩展控件)
新增 /values/Attrs.xml 文件 <?xml version="1.0" encoding="utf-8" ?> <resour ...
- ViewPager实现图片轮翻效果
很多App都有这种效果,特别一些电商类的App,顶部每隔几秒钟会向右翻页显示下张图片,用来作推广或者内容展示用的.今天来简单地模仿一下,还自带一个自动跳动的小功能(底部有几个小点,图片移动的时候,点的 ...
- ios图片轮播效果
代码地址如下:http://www.demodashi.com/demo/11959.html ImageCarousel 简单封装的图片轮播器 内存过大由于我加载的图片分辨率较高(4k) 文件目录 ...
- jQuery个性化图片轮播效果
jQuery个性化图片轮播效果 购物产品展示:图片轮播器<效果如下所示> 思路说明: 每隔一段时间,实现图片的自动切换及选项卡选中效果,鼠标划入图片动画停止,划出或离开动画开始 两个区域: ...
- CSS3图片轮播效果
原文:CSS3图片轮播效果 在网页中用到图片轮播效果,单纯的隐藏.显示,那再简单不过了,要有动画效果,如果是自己写的话(不用jquery等),可能要费点时间.css3的出现,让动画变得不再是问题,而且 ...
- js实现淘宝首页图片轮播效果
原文:http://ce.sysu.edu.cn/hope2008/Education/ShowArticle.asp?ArticleID=10585 <!DOCTYPE html> &l ...
随机推荐
- ARKit:增强现实技术在美团到餐业务的实践
前言 增强现实(Augmented Reality)是一种在视觉上呈现虚拟物体与现实场景结合的技术.Apple 公司在 2017 年 6 月正式推出了 ARKit,iOS 开发者可以在这个平台上使用简 ...
- 第2天:Django路由与视图
在应用中创建视图定义路由 配置文件说明 静态文件使用 Django解析路由的流程 路由顺序 路由命名与reverse反推 在应用中创建视图定义路由 前面我们已经创建了子应用users,但是这个user ...
- 通过TortoiseGit上传项目到GitHub
1.安装msysgit和TortoiseGit : 2.TortoiseGit 设置: (1).确保安装成功: (2).设置用户名和邮箱: 3.登陆github并进入设置页面: 4.添加 SSH Ke ...
- [BZOJ3638 && BZOJ3272]带修区间不相交最大K子段和(线段树模拟费用流)
https://www.cnblogs.com/DaD3zZ-Beyonder/p/5634149.html k可重区间集问题有两种建图方式,可能这一种才可以被线段树优化. 换个角度看,这也是一个类似 ...
- bzoj 3275 最小割
给你一堆东西,叫你选一些东西出来,使得价值最大,要求选出的东西集合中的任意a,b满足性质p. 可以考虑: 1.拟阵? 2.二分图? 这道题由于数学硬伤,不知道不存在两条直角边是奇数,斜边是整数的直角三 ...
- SMACH(五)----用户数据UserData类和重映射Remapper类的原理和例子
用户数据UserData类和重映射Remapper类包含在smach中的user_data.py文件中实现,该博文主要介绍其原理和例子 UserData主要用于状态之间的数据传递,包括数据的输入inp ...
- nginx新建nginx_fzjh.conf文件,不使用默认配置文件
worker_processes 4; events{ worker_connections 1024; } http{ server { listen 80; server_name myserve ...
- Git_多人协作
当你从远程仓库克隆时,实际上Git自动把本地的master分支和远程的master分支对应起来了,并且,远程仓库的默认名称是origin. 要查看远程库的信息,用git remote: $ git r ...
- PHP通过AJAX及Access-Control-Allow-Origin实现跨域访问
这里的跨域实质上是由浏览器同源策略限制的一类请求场景,浏览器同源策略SOP(Same origin policy)是一种约定,由Netscape公司1995年引入浏览器,它是浏览器最核心也最基本的安全 ...
- html5调用手机本地摄像头和相册识别二维码详细实现过程
项目中有用到h5识别我们的单据,单据上面有二维码. 实现的场景就是业务人员扫码 类似以下场景 业务员拿到单据以后,直接可以扫码进入相关单据业也可以 输入二维码下方的号码进行识别 下面是h5的页面构造 ...