Android使用ViewPager实现无限循环滑动及轮播(附源代码)
MainActivity例如以下:
package cc.ww; import java.util.ArrayList; import android.app.Activity;
import android.content.Context;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.support.v4.view.ViewPager;
import android.view.MotionEvent;
import android.view.View;
import android.view.ViewGroup;
import android.view.Window;
import android.view.WindowManager;
import android.view.View.OnTouchListener;
import android.widget.ImageView;
import android.widget.LinearLayout;
/**
* 原创作者:
* 谷哥的小弟 http://blog.csdn.net/lfdfhl
*
* Demo描写叙述:
* 1 ViewPager的自己主动轮播
* 2 同一时候支持手动切换ViewPager的Item
* 3 攻克了当图片小于三张ViewPager轮播时崩溃的问题
*/
public class MainActivity extends Activity {
private Context mContext;
private Handler mHandler;
private Runnable mRunnable;
private ViewPager mViewPager;
private int viewPagerItemSize=0;
private ImageView[] dotImageViews;
private final int INTERVAL =1000 * 3;
private ArrayList<Integer> mArrayList;
private LinearLayout mDotsLinearLayout;
private final static int SET_VIEWPAGER_ITEM=9527;
private LauncherViewPagerAdapter mViewPagerAdapter;
private PageChangeListenerImpl mPageChangeListenerImpl; @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//去掉状态栏
requestWindowFeature(Window.FEATURE_NO_TITLE);
getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
WindowManager.LayoutParams.FLAG_FULLSCREEN);
setContentView(R.layout.activity_main);
init();
} //初始化
private void init() {
initData();
if(viewPagerItemSize>0){
initDots();
initViewPager();
setAutoChangeViewPager();
}
} //准备ViewPager将显示的数据
private void initData(){
mContext = this;
mArrayList=new ArrayList<Integer>();
mArrayList.add(R.drawable.a);
mArrayList.add(R.drawable.b);
mArrayList.add(R.drawable.c);
mArrayList.add(R.drawable.d);
viewPagerItemSize=mArrayList.size();
} //初始化ViewPager
private void initViewPager(){
mViewPager = (ViewPager) findViewById(R.id.guide_viewpager);
mViewPagerAdapter = new LauncherViewPagerAdapter(mContext);
mViewPagerAdapter.setAdapterData(mArrayList);
mViewPager.setAdapter(mViewPagerAdapter);
int currentItem = Integer.MAX_VALUE/2 - Integer.MAX_VALUE/2 % viewPagerItemSize;
mViewPager.setCurrentItem(currentItem);
setdotImageViews(currentItem%viewPagerItemSize);
mViewPager.setOnTouchListener(new OnTouchListener() {
@Override
public boolean onTouch(View arg0, MotionEvent arg1) {
mViewPager.requestDisallowInterceptTouchEvent(true);
return false;
}
});
} //初始化底部小圆点
private void initDots() {
mDotsLinearLayout = (LinearLayout) findViewById(R.id.dotsLinearLayout);
dotImageViews = new ImageView[viewPagerItemSize];
for (int i = 0; i < dotImageViews.length; i++) {
LinearLayout layout = new LinearLayout(mContext);
ImageView imageView = new ImageView(mContext);
imageView.setLayoutParams(new ViewGroup.LayoutParams(20, 20));
if (i == 0) {
imageView.setBackgroundResource(R.drawable.guide_dot_white);
} else {
layout.setPadding(20, 0, 0, 0);
imageView.setBackgroundResource(R.drawable.guide_dot_black);
}
dotImageViews[i] = imageView;
layout.addView(imageView);
mDotsLinearLayout.addView(layout);
}
} //开启ViewPager的自己主动轮播
@SuppressWarnings("deprecation")
private void setAutoChangeViewPager() {
mPageChangeListenerImpl = new PageChangeListenerImpl();
mViewPager.setOnPageChangeListener(mPageChangeListenerImpl); mHandler = new Handler() {
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
switch (msg.what) {
case SET_VIEWPAGER_ITEM:
if (mViewPager != null && mViewPagerAdapter != null) {
int currentItemIndex = mViewPager.getCurrentItem();
int itemsCount = mViewPagerAdapter.getCount();
if ((currentItemIndex + 1) < itemsCount) {
mViewPager.setCurrentItem(currentItemIndex + 1, true);
} else {
mViewPager.setCurrentItem(0, false);
}
}
break;
}
}
}; mRunnable = new Runnable() {
@Override
public void run() {
Message message = mHandler.obtainMessage();
message.what = SET_VIEWPAGER_ITEM;
mHandler.sendMessage(message);
mHandler.removeCallbacks(mRunnable);
mHandler.postDelayed(this, INTERVAL);
}
}; mHandler.postDelayed(mRunnable, INTERVAL);
} //设置小圆点的显示
private void setdotImageViews(int selected){
for (int i = 0; i < dotImageViews.length; i++) {
dotImageViews[selected].setBackgroundResource(R.drawable.guide_dot_white);
if (selected != i) {
dotImageViews[i].setBackgroundResource(R.drawable.guide_dot_black);
}
}
} //ViewPager翻页后更新小圆点的显示
private class PageChangeListenerImpl implements ViewPager.OnPageChangeListener {
@Override
public void onPageSelected(int selected) {
setdotImageViews(selected % viewPagerItemSize);
} @Override
public void onPageScrolled(int arg0, float arg1, int arg2) {
} @Override
public void onPageScrollStateChanged(int state) { } } @Override
protected void onDestroy() {
super.onDestroy();
if(null!=mViewPager){
mViewPager.removeAllViews();
mViewPager = null;
}
} }
LauncherViewPagerAdapter例如以下:
package cc.ww; import java.util.ArrayList;
import android.content.Context;
import android.support.v4.view.PagerAdapter;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.Toast; public class LauncherViewPagerAdapter extends PagerAdapter {
private Context mContext;
private ArrayList<Integer> pagesArrayList;
private View itemView; public LauncherViewPagerAdapter(Context context) {
this.mContext = context;
} /**
* 设置ViewPager将要显示的数据.
* 当图片数量小于三张的时候,通过复制组拼数据
*/
public void setAdapterData(ArrayList<Integer> arrayList){
pagesArrayList=arrayList;
if (pagesArrayList.size()<1) {
Toast.makeText(mContext, "ViewPager item size=0", Toast.LENGTH_LONG).show();
}else if(pagesArrayList.size()<2){
pagesArrayList.add(pagesArrayList.get(0));
pagesArrayList.add(pagesArrayList.get(0));
pagesArrayList.add(pagesArrayList.get(0));
}else if(pagesArrayList.size()<3){
pagesArrayList.add(pagesArrayList.get(0));
pagesArrayList.add(pagesArrayList.get(1));
}
System.out.println("-----> PagerAdapter中item的个数="+pagesArrayList.size());
} @Override
public int getCount() {
return Integer.MAX_VALUE;
} @Override
public Object instantiateItem(ViewGroup container, int position) {
if (pagesArrayList.size() > 0) {
itemView=LayoutInflater.from(mContext).inflate(R.layout.guide_pager_adapter, null);
itemView.setFocusable(true);
ImageView imageView = (ImageView) itemView.findViewById(R.id.imageView);
imageView.setBackgroundResource(pagesArrayList.get(position%pagesArrayList.size()));
container.addView(itemView);
return itemView;
}
return null; } @Override
public boolean isViewFromObject(View arg0, Object arg1) {
return arg0 == arg1;
} @Override
public void destroyItem(ViewGroup container, int position, Object object) {
container.removeView((View) object);
}
}
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"> <android.support.v4.view.ViewPager
android:id="@+id/guide_viewpager"
android:layout_width="match_parent"
android:layout_height="match_parent" /> <LinearLayout
android:id="@+id/dotsLinearLayout"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
android:layout_marginBottom="100px"
android:layout_centerHorizontal="true"
android:orientation="horizontal">
</LinearLayout> </RelativeLayout>
guide_pager_adapter.xml例如以下:
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"> <ImageView
android:id="@+id/imageView"
android:layout_width="match_parent"
android:layout_height="match_parent" /> </RelativeLayout>
Android使用ViewPager实现无限循环滑动及轮播(附源代码)的更多相关文章
- Android使用ViewPager实现左右循环滑动及轮播效果
边界的时候会看到一个不能翻页的动画,可能影响用户体验.此外,某些区域性的ViewPager(例如展示广告或者公告之类的ViewPager),可能需要自动轮播的效果,即用户在不用滑动的情况下就能够看到其 ...
- Android 使用ViewPager实现左右循环滑动图片
ViewPager这个小demo实现的是可以左右循环滑动图片,下面带索引,滑到最后一页在往右滑动就要第一页,第一页往左滑动就到最后一页,先上效果图,用美女图片是我一贯的作风,呵呵 1. 首先看一 ...
- Android 使用ViewPager 做的半吊子的图片轮播
Android 使用ViewPager 做的半吊子的图片轮播 效果图 虽然不咋样,但是最起码的功能是实现了,下面我们来一步步的实现它. 界面 下面我们来分析一下界面的构成 整体的布局: 因为我们要做出 ...
- android 自定义Viewpager实现无限循环
; i < imageUrls.length; i ++){ ADInfo info = new ADInfo(); info.setUrl(imageUrls[i]); info.setCon ...
- 多组图自动无限循环(swiper轮播)
前两天的一个项目中遇到多组图片无限轮播,当时采用了swiper 但是没有解决让它无限轮播.今天再次尝试了一下发现是自己的样式写错了.今天在这里写一下,为了给自己一个警醒不要犯同样的错误 首先先引入一下 ...
- Android 自定义viewpager 三张图片在同一屏幕轮播的效果
github:https://github.com/nickeyCode/RoundImageViewPager 说实话不知道怎么描述这个效果,在网页上见得跟多,公司要求做这个效果得时候不知道怎么用文 ...
- android中无限循环滑动的gallery实例
android中无限循环滑动的gallery实例 1.点击图片有变暗的效果,使用imageview.setAlpha(),并且添加ontouchListener public void init() ...
- 关于UIScrollView无限循环滑动
在使用某宝或某东购物的时候,我们会在其首页看到一个可以滑动的版块,这个版块的实现就是一个UIScrollView.在我们使用UIScrollView的时候会发现,滑动到最后的时候,UIScrollVi ...
- Android之无限轮播图源代码
Android轮播广告图是大家经常用到的一个控件今天便撸了一把代码 实现步骤 使用Viewpager进行实现图片滑动 设置ViewPager的数据,让其无限切换 Activity代码 public c ...
随机推荐
- RSTP介绍
1. 介绍 RSTP(Rapid Spanning Tree Protocol),快速生成树协议,标准为802.1w(已合入802.1D-2004)RSTP是对STP技术的修改和补充,最大特点就是快速 ...
- android基本控件学习-----ToggleButton&Switch
ToggleButton(开关按钮)和Switch(开关)讲解: 一.核心属性讲解: (1)ToggleButton textOn:按钮被选中的时候文字显示 textOff:按钮没有被选中的时候文字显 ...
- HDU5006 Resistance(高斯消元)
给你一个复杂的网路图,然后告诉你s,t,求s,t的等效电阻.方法是设s的电势为1,t的电势为0.然后对于其它的每个点x,满足的是sigma(ux-uy)/R(x,y)(即对每个与x相连的节点y,电势差 ...
- 【转载】Word2010编号列表&多级列表
1.引用场景 对于一份标准.漂亮的word文档,编号列表和多级列表的设置时必不可少的,正因为有它们,文档看起来才更专业,使用起来才更加的方便.如下面截图一般,这是十分常见的多级列表设置 ...
- ASP.NET MVC创建静态页
1.在MVC下新建一个类:StaticPageHelper public class StaticPageHelper { /// <summary> /// 根据View视图生成静态页面 ...
- 强连通分量(Tarjan)模板
贴模板,备忘. 模板1: #include<iostream> #include<cstring> #include<cmath> #include<cstd ...
- NIO2.0之copy、delete和move
转自:http://www.importnew.com/15884.html Java 7引入了NIO.2,NIO.2是继承自NIO框架,并增加了新的功能(例如:处理软链接和硬链接的功能).这篇帖子包 ...
- 苹果iOS APP配置HTTPS,iOS ATS配置SSL,苹果ATS标准解决方案
参考沃通:
- windows上,python安装非官方包,提示error: Unable to find vcvarsall.bat
在windows机器上安装python非官方包,如果环境只是用于开发,不作任何测试的话,最好的解决办法是: 在Linux上pip安装好之后,把python根目录lib/python3.6/site-p ...
- 【dubbo】服务提供者运行的三种方式
[dubbo]服务提供者运行的三种方式 学习了:https://blog.csdn.net/yxwb1253587469/article/details/78712451 1,使用容器: 2,使用自建 ...