对于ViewPager 广告页这个功能很多APP都有这个功能在网上也看过一些资料,我就在这把我自己完整的实现方法写出来吧
成都创新互联长期为1000多家客户提供的网站建设服务,团队从业经验10年,关注不同地域、不同群体,并针对不同对象提供差异化的产品和服务;打造开放共赢平台,与合作伙伴共同营造健康的互联网生态环境。为南县企业提供专业的成都网站建设、成都网站制作,南县网站改版等技术服务。拥有10余年丰富建站经验和众多成功案例,为您定制开发。
基础的ViewPager:
<?xml version="1.0" encoding="utf-8"?>
很简单 仅仅是一个ViewPager
接下来简单的设置一下ViewPager的Adapter 添加ImageView
public class MainActivity extends AppCompatActivity { private ViewPager topVp; private int[]images = new int[]{R.mipmap.ad0, R.mipmap.ad1, R.mipmap.ad3}; //模拟存放要展示的图片 private ListimageViews ; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); initImageViews(); initVp(); } /** * 初始化图片资源 */ private void initImageViews() { imageViews = new ArrayList<>(); for(int i = 0;i
上述是最基础的一个ViewPager 下面我们就在这个基础上改造就可以了
实现无限循环滑动:
这里我事先循环滑动的方式很简单 就是把 adapter的count 设置为一个很大的值 这样 让它滑不到头 然后切换图片 就可以实现 虽然方法比较LOW 但是效果还是可以的
代码在基础的ViewPager下修改如下 :
public class MainActivity extends AppCompatActivity { private ViewPager topVp; private int[]images = new int[]{R.mipmap.ad0, R.mipmap.ad1, R.mipmap.ad3}; //模拟存放要展示的图片 private ListimageViews ; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); initImageViews(); initVp(); } /** * 初始化图片资源 */ private void initImageViews() { imageViews = new ArrayList<>(); for(int i = 0;i
这样 之后就可以实现无限循环右滑了 但是在程序刚启动 是 无法向左滑动的 要解决 很简单 只需要在开始的时候
viewPager.setCurrentItem(1000*imageViews.size());
即可 这样 就可以 实现 无限左右滑了
自动定时循环滑动:
下面增加自动定时左右滑动的功能
要实现自动滑动 最主要的是 实现定时器功能我这里使用 Handler+Runnable的方法在上述代码的基础上 修改 如下:
protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); initImageViews(); initVp(); handler = new Handler(); handler.postDelayed(new TimerRunnable(),5000); } class TimerRunnable implements Runnable{ @Override public void run() { int curItem = topVp.getCurrentItem(); topVp.setCurrentItem(curItem+1); if (handler!=null){ handler.postDelayed(this,5000); } } } @Override protected void onDestroy() { super.onDestroy(); handler = null; //此处在Activity退出时及时 回收 }
这之后 就可以实现自动滑动了
添加左下角圆形小按钮:
接下来添加 左下角的导航小原点
首先 修改布局 :
<?xml version="1.0" encoding="utf-8"?>
我们需要的原点 要放在 LinearLayout布局中
主要原理 就是向这个LinearLayout中动态添加 小圆点 即可
public class MainActivity extends AppCompatActivity { private ViewPager topVp; private int[]images = new int[]{R.mipmap.ad0, R.mipmap.ad1, R.mipmap.ad3}; //模拟存放要展示的图片 private ListimageViews ; private List txtPoints; private LinearLayout lin_points; private Handler handler; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); lin_points = (LinearLayout) findViewById(R.id.lin_points); initImageViews(); initVp(); initCircle(); /* * 计时器 */ handler = new Handler(); handler.postDelayed(new TimerRunnable(),5000); } /** * 初始化小圆点 */ private void initCircle() { txtPoints = new ArrayList<>(); int d = 20; int m = 7; for (int i = 0; i < imageViews.size(); i++) { TextView txt = new TextView(this); if (i == 0) { txt.setBackgroundResource(R.drawable.point_pink); } else { txt.setBackgroundResource(R.drawable.point_grey); } LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(d, d); params.setMargins(m, m, m, m); txt.setLayoutParams(params); txtPoints.add(txt); lin_points.addView(txt); } } class TimerRunnable implements Runnable{ @Override public void run() { int curItem = topVp.getCurrentItem(); topVp.setCurrentItem(curItem+1); changePoints((curItem+1)%imageViews.size()); if (handler!=null){ handler.postDelayed(this,5000); } } } @Override protected void onDestroy() { super.onDestroy(); handler = null; } /** * 初始化图片资源 */ private void initImageViews() { imageViews = new ArrayList<>(); for(int i = 0;i
给ViewPager添加切换动画:
topVp.setPageTransformer(true,new CubeOutTransformer());
调用 此行代码 可以添加 后面的TransFormer类 是自定义的过渡效果类
控制ViewPager 自动切换的速度
ViewPager自身的切换速度是写死的,我们无法修改,但是我们可以通过源码看到,ViewPager的切换速度是通过 Scroller类 控制的,而Scroller类中是可以设置过渡的时间的,因此 我们可以通过自己创建一个Scroller类 继承 Scroller 然后 通过反射 把ViewPager中的mScroller属性 设置成我们自己的可以设置时间的Scroller类即可
下面是代码:
public class FixedSpeedScroller extends Scroller { private int mDuration = 1500; public FixedSpeedScroller(Context context) { super(context); } public FixedSpeedScroller(Context context, Interpolator interpolator) { super(context, interpolator); } @Override public void startScroll(int startX, int startY, int dx, int dy, int duration) { // Ignore received duration, use fixed one instead super.startScroll(startX, startY, dx, dy, mDuration); } @Override public void startScroll(int startX, int startY, int dx, int dy) { // Ignore received duration, use fixed one instead super.startScroll(startX, startY, dx, dy, mDuration); } public void setmDuration(int time) { mDuration = time; } public int getmDuration() { return mDuration; } }
反射修改ViewPager属性:
try { Field field = ViewPager.class.getDeclaredField("mScroller"); field.setAccessible(true); scroller = new FixedSpeedScroller(getActivity()); scroller.setmDuration(1000); field.set(topVp, scroller); } catch (Exception e) { // e.printStackTrace(); System.out.println("aaaaaa错误啦"); }
这样就可以控制速度了
好了,Android ViewPager广告页可无限循环滑动并可自动滚动带有小圆点的功能基本就实现了,具体参数大家可以自行设定