ViewPager在首尾页滑动切换

2023-12-13 15:32
文章标签 切换 滑动 viewpager 首尾

本文主要是介绍ViewPager在首尾页滑动切换,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

转载自:http://www.cnblogs.com/xiabi/p/4343030.html


  上图是我们需要实现的效果图,功能有如下三个:

  1. 手势滑动可以切换界面,点击上面的引导一到引导四也可以切换到相应的画面。

  2. 切换界面时,引导一到引导四下面的横线会相应的移动到对应的地方。

  3. 没有手势时,界面会自动轮转,有种广告轮转的效果;有手势是,会停止轮转。

 

  在这篇文章里,我们先实现第一个功能。为了实现这个功能,我们需要知道ViewPager控件,它是google SDk中自带的一个android-support-v4.jar的一个类,可以用来实现屏幕间的切换。这个包在我们创建新工程时会自动添加,因此无需紧张。

首先我们先来看主界面是如何设计的:

 

  布局代码就不贴出来了,正如图中三个红框,第一个红框是四个TextView,第二个红框是一个ImageView,第三个红框是ViewPager。在ViewPager里,切换界面时,实际上是切换View,因此需要创建对应的四个布局文件,这个布局文件很简单,只需要设置背景为图片就好。

PagerAdaper的说明

  类似Listview,我们需要一个适配器,ViewPager对应的适配器是PagerAdapter,这是一个抽象类,因此我们需要自己写一个类来继承PagerAdapter。继承pageradapter,至少必须重写下面的四个方法:

1 instantiateItem(ViewGroup, int)
2. destroyItem(ViewGroup, int, Object)
3. getCount()
4. isViewFromObject(View, Object) 

具体的这个类可以看下面的代码:

复制代码
package com.example.viewpager;import java.util.List;import android.support.v4.view.PagerAdapter;
import android.support.v4.view.ViewPager;
import android.view.View;public class MyPagerAdater extends PagerAdapter {// 放置页卡界面的Listprivate List<View> listview;public MyPagerAdater(List<View> l) {listview = l;}// 当要显示的图片可以进行缓存的时候,会调用这个方法进行显示图片的初始化,我们将要显示的ImageView加入到ViewGroup中,然后作为返回值返回即可
    @Overridepublic Object instantiateItem(View container, int position) {// TODO Auto-generated method stub
        ((ViewPager) container).addView(listview.get(position));return listview.get(position);}// 获取要滑动的控件的数量,在这里应该是展示的页卡数量
    @Overridepublic int getCount() {// TODO Auto-generated method stubreturn listview.size();}// 来判断显示的是否是同一张图片,这里我们将两个参数相比较返回即可
    @Overridepublic boolean isViewFromObject(View arg0, Object arg1) {// TODO Auto-generated method stubreturn arg0 == arg1;}// PagerAdapter只缓存三张要显示的图片,如果滑动的图片超出了缓存的范围,就会调用这个方法,将图片销毁
    @Overridepublic void destroyItem(View container, int position, Object object) {// TODO Auto-generated method stub
        ((ViewPager) container).removeView(listview.get(position));}}
复制代码

MyPagerAdapter的使用

  MyPagerAdapter写好后,如何运用呢,其实跟ListView是相似的,在MyPagerAdapter的构造器中我们需要传入List数组,这个List里放的时页卡的界面,因此需要用到LayoutInflater来获得View。

LayoutInflater inflater = getLayoutInflater();
listview.add(inflater.inflate(R.layout.l1, null));
listview.add(inflater.inflate(R.layout.l2, null));
listview.add(inflater.inflate(R.layout.l3, null));
listview.add(inflater.inflate(R.layout.l4, null));

  接着就是简单的mViewPager.setAdapter(mPagerAdater);以及mPagerAdater.notifyDataSetChanged();就行。

 

  之前我们说到点击上面的引导一到引导四也可以切换到相应的画面,这个也是很容易实现的,只需设置TexView的监听器并且在onClick函数里调用setCurrentItem(index)即可。

 

  另外我们发现一个问题,滑动到最后一个页面时,发现无法继续向右滑动,这怎么解决呢?我们只需监听ViewPager的滑动过程,

因此我们需要实现OnPageChangeListener这个接口。OnPageChangeListener这个接口需要实现三个方法:(onPageScrollStateChanged,onPageScrolled ,onPageSelected)

① onPageScrollStateChanged(int arg0) :此方法是在状态改变的时候调用。其中arg0这个参数有三种状态(0,1,2)。arg0 ==1的时辰默示正在滑动,arg0==2的时辰默示滑动完毕了,arg0==0的时辰默示什么都没做。

  页卡正常滑动时,会经历 1-2-0的三个阶段;

  页卡在最后一页向右滑,或者第一页向左滑经历 1-0-2-0的阶段;

  直接调用 setCurrentItem则只是经历 2-0的阶段

② onPageScrolled(int arg0,float arg1,int arg2):当页面在滑动的时候会调用此方法,在滑动被停止之前,此方法回一直得到调用。其中三个参数的含义分别为:

arg0 :当前页面,及你点击滑动的页面;  arg1:当前页面偏移的百分比;  arg2:当前页面偏移的像素位置   。

③ onPageSelected(int arg0) :此方法是页面跳转完后得到调用,arg0是你当前选中的页面的Position(位置编号)。

 

  下面重写onPageScrollStateChanged方法即可。具体代码如下:

复制代码
public class MyOnPageChangeListener implements OnPageChangeListener {private boolean isScrolled = false;public void onPageScrollStateChanged(int arg0) {switch (arg0) {case 0:// 每一次的滑动arg0都会经历1-2-0的阶段,但是在最后一个页面向右滑,或者第一个页面向左滑时会经历 1-0-2-0的阶段// 例如: 最后页面右滑时,刚刚开始会是1,这时isScrolled为false,但是没有下一页面,所以此时的页面还是最后一个页面,满足if条件if (mViewPager.getCurrentItem() == mViewPager.getAdapter().getCount() - 1 && !isScrolled)mViewPager.setCurrentItem(0);else if (mViewPager.getCurrentItem() == 0 && !isScrolled) {mViewPager.setCurrentItem(mViewPager.getAdapter().getCount() - 1);}break;case 1:isScrolled = false;break;case 2:isScrolled = true;break;}}........
}
复制代码

这篇关于ViewPager在首尾页滑动切换的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/488977

相关文章

React实现原生APP切换效果

《React实现原生APP切换效果》最近需要使用Hybrid的方式开发一个APP,交互和原生APP相似并且需要IM通信,本文给大家介绍了使用React实现原生APP切换效果,文中通过代码示例讲解的非常... 目录背景需求概览技术栈实现步骤根据 react-router-dom 文档配置好路由添加过渡动画使用

Spring Boot实现多数据源连接和切换的解决方案

《SpringBoot实现多数据源连接和切换的解决方案》文章介绍了在SpringBoot中实现多数据源连接和切换的几种方案,并详细描述了一个使用AbstractRoutingDataSource的实... 目录前言一、多数据源配置与切换方案二、实现步骤总结前言在 Spring Boot 中实现多数据源连接

基于Redis有序集合实现滑动窗口限流的步骤

《基于Redis有序集合实现滑动窗口限流的步骤》滑动窗口算法是一种基于时间窗口的限流算法,通过动态地滑动窗口,可以动态调整限流的速率,Redis有序集合可以用来实现滑动窗口限流,本文介绍基于Redis... 滑动窗口算法是一种基于时间窗口的限流算法,它将时间划分为若干个固定大小的窗口,每个窗口内记录了该时间

MyBatis 切换不同的类型数据库方案

下属案例例当前结合SpringBoot 配置进行讲解。 背景: 实现一个工程里面在部署阶段支持切换不同类型数据库支持。 方案一 数据源配置 关键代码(是什么数据库,该怎么配就怎么配) spring:datasource:name: test# 使用druid数据源type: com.alibaba.druid.pool.DruidDataSource# @需要修改 数据库连接及驱动u

解决Office Word不能切换中文输入

我们在使用WORD的时可能会经常碰到WORD中无法输入中文的情况。因为,虽然我们安装了搜狗输入法,但是到我们在WORD中使用搜狗的输入法的切换中英文的按键的时候会发现根本没有效果,无法将输入法切换成中文的。下面我就介绍一下如何在WORD中把搜狗输入法切换到中文。

专题二_滑动窗口_算法专题详细总结

目录 滑动窗口,引入: 滑动窗口,本质:就是同向双指针; 1.⻓度最⼩的⼦数组(medium) 1.解析:给我们一个数组nums,要我们找出最小子数组的和==target,首先想到的就是暴力解法 1)暴力: 2)优化,滑动窗口: 1.进窗口 2.出窗口 3.更新值 2.⽆重复字符的最⻓⼦串(medium) 1)仍然是暴力解法: 2)优化: 进窗口:hash[s[rig

15 组件的切换和对组件的data的使用

划重点 a 标签的使用事件修饰符组件的定义组件的切换:登录 / 注册 泡椒鱼头 :微辣 <!DOCTYPE html><html lang="en"><head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><meta http-equiv="X-UA-

71-java 导致线程上下文切换的原因

Java中导致线程上下文切换的原因通常包括: 线程时间片用完:当前线程的时间片用完,操作系统将其暂停,并切换到另一个线程。 线程被优先级更高的线程抢占:操作系统根据线程优先级决定运行哪个线程。 线程进入等待状态:如线程执行了sleep(),wait(),join()等操作,使线程进入等待状态或阻塞状态,释放CPU。 线程占用CPU时间过长:如果线程执行了大量的I/O操作,而不是CPU计算

[轻笔记]ubuntu shell脚本切换conda环境

source /home/yourhostname/anaconda3/etc/profile.d/conda.sh # 关键!!!conda activate env_name

ViewPager+fragment实现切换页面(一)

如今的很多应用中都是下面有一排按钮,点击可以切换页面,滑动也可以切换页面。下面就来简单的实现这个功能。 思路 首先肯定是会用到viewpager这个控件,为了能够向下兼容,最好用v4包下的viewpager,Activity要继承FragmentActivity 其次用一个集合来存储所有的fragment页面在设置viewpager的适配器时,把存储fragment页面的list集合传入ada