一、问题概述

  使用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控件的更多相关文章

  1. 【Android】带底部指示的自定义ViewPager控件

    在项目中经常需要使用轮转广告的效果,在android-v4版本中提供的ViewPager是一个很好的工具,而一般我们使用Viewpager的时候,都会选择在底部有一排指示物指示当前显示的是哪一个pag ...

  2. Android View体系(十)自定义组合控件

    相关文章 Android View体系(一)视图坐标系 Android View体系(二)实现View滑动的六种方法 Android View体系(三)属性动画 Android View体系(四)从源 ...

  3. android之视频播放系统VideoView和自定义VideoView控件的应用

    Android播放视频,包含系统自带VideoView控件,和自定义VideoView控件,可全屏播放,案例包含了本地视频和网络视频. 1:自定义VideoView控件 2:布局代码 3:Activi ...

  4. xamarin.Android ImageView 图片圆角(自定义属性、扩展控件)

    新增 /values/Attrs.xml 文件 <?xml version="1.0" encoding="utf-8" ?> <resour ...

  5. ViewPager实现图片轮翻效果

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

  6. ios图片轮播效果

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

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

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

  8. CSS3图片轮播效果

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

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

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

随机推荐

  1. UVALive - 6912 Prime Switch (状压DP)

    题目链接:传送门 [题意]有n个灯,m个开关,灯的编号从1~n,每个开关上有一个质数,这个开关同时控制编号为这个质数的倍数的灯,问最多有多少灯打开. [分析]发现小于根号1000的质数有10个左右,然 ...

  2. 第4天:Django的cookie和session

    Cookie Session Cookie 浏览器请求服务器是无状态的,它的每一次请求对于服务器来说都是新的,服务器默认不会保存用户的状态数据.但很多时候,服务器需要保存用户的一些状态数据,比如用户是 ...

  3. [CC-CHEFINV]Chef and Swaps

    [CC-CHEFINV]Chef and Swaps 题目大意: 长度为\(n(n\le2\times10^5)\)的数列,\(q(q\le2\times10^5)\)次询问,每次问交换\(A_x\) ...

  4. JBOSS集群和安装

    JBOSS集群和安装 http://jijian91.com/blog20071010/jboss-cluster-part5.html http://wing123.iteye.com/blog/3 ...

  5. CF980E The Number Games【树链剖分/线段树】

    CF980E The Number Games 题意翻译 Panel 国将举办名为数字游戏的年度表演.每个省派出一名选手. 国家有 n 个编号从 1 到 n 的省,每个省刚好有一条路径将其与其他省相连 ...

  6. java8函数式接口小例子

    // Function<T, R> -T作为输入,返回的R作为输出 Function<String,String> function = (x) -> {System.o ...

  7. [Servlet]什么是Servlet

    什么是Servlet Servlet是JavaEE三大组建之中的一个,是使用Java语言编写server端的程序,主要用来处理Web应用程序中的请求-响应. Servlet并没有main之类的执行方法 ...

  8. 【Android开发学习46】Android平台切割PNG图片成小png图片

    功能描写叙述: 分解 assets 文件夹文件下的 PNG 图片成 各个小尺寸 PNG 图片 . 主函数运行: // 创建文件夹, 用来保存分解出来的图片 createPath("/sdca ...

  9. Spring DAO vs Spring ORM vs Spring JDBC

    Pat 的疑惑 最近关注于 Spring 提供的数据访问技术,对于 Spring 相关的这几个项目有何不同我不是太明白: Spring-DAO (http://docs.spring.io/sprin ...

  10. xcode4.3.2 arc模式下导入非arc的文件 转

    在arc模式下,我们经常会用到非arc的类库,此时我们可以在Compile Sources下对该文件进行编辑加入 -fno-objc-arc   如图中所示,就可以使用非arc的类库了   转:htt ...