在android中,使用过viewpager的人都清楚,我们如果使用viewpager进行滑动时,如果通过手指滑动来进行的话,可以根据手指滑动的距离来实现,但是如果通过setCurrentItem函数来实现的话,则会发现没有过度动画的效果,而是直接闪过去的,那么在有时我们就会遇到一个需求,比如说我们想要通过使用setCurrentItem函数来进行viewpager的滑动,并且需要有过度滑动的动画,那么,该如何做呢?首先我们大致看下viewpager的源代码:

首先我们看下setCurrentItem的执行了什么?

我们继续往下看setCurrentItemInternal的函数,

继续往下看setCurrentItemInternal的函数内容,

看到这个一大坨代码后是不是有点慌,别怕,我们其实看到这个函数就够了scrollToItem,然后我们看这个函数具体执行的是:

这个函数中,其实我们最主要关心的也是smoothScrollTo函数就好了,我们具体看下这个函数,

然后这个函数中,其实我们看到具体执行滑动的其实就一句话,就是mScroller.startScroll(sx, sy, dx, dy, duration);

那么我们可以看到,是mScroller这个对象进行滑动的,那么,最简单粗暴的方法就是重写这个类,并且重写后怎么付给viewpager呢,这就是接下来讲的,这其中用到了java的反射机制,我们来看下:

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;
}
}

这是我们重写的scroller的类,其实比较简单,我们只是将原来滑动的方法进行修改,滑动的具体时间,改为我们自己设定的,传入的参数作废即可。这样的话,我们通过自己自定义滑动的时间,就可以控制滑动的速度。然后下一步就是如何将其赋值给原先的viewpager类,这里呢,就用到了java的反射的机制,我们看具体的代码:

try {
Field field = ViewPager.class.getDeclaredField("mScroller");
field.setAccessible(true);
FixedSpeedScroller scroller = new FixedSpeedScroller(mViewPager.getContext(),
new AccelerateInterpolator());
field.set(mViewPager, scroller);
scroller.setmDuration(2000);
} catch (Exception e) { }

这呢,就是通过反射的机制,将我们自定义的scroller传进去,从而实现了我们自己控制滑动速度。

android之ViewPager修改滑动速度的更多相关文章

  1. Android中ViewPager实现滑动条及与Fragment结合的实例教程

    ViewPager类主要被用来实现可滑动的视图功能,这里我们就来共同学习Android中ViewPager实现滑动条及与Fragment结合的实例教程,需要的朋友可以参考下 自主实现滑动指示条先上一个 ...

  2. Android 禁止ViewPager左右滑动的功能实现

    来来来,各位看官~ Look here!!! Android    禁止ViewPager左右滑动的功能实现!! I think it`s so easy,无需重写ViewPager!!! JUST ...

  3. ViewPager切换滑动速度修改

    ViewPager的setCurrentItem 滑动速度是写死地 下面的方法可以修改,在此以做记录 ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 ...

  4. Android 获取控件滑动速度,速度跟踪器VelocityTracker;

    VelocityTracker 速度跟踪器 在写关于Android滑动的控件,如果用户手指在屏幕上(当前位置 - 起始位置 > 某个数值)就做一个界面切换,但是总感觉太生硬,只有满足上面的条件才 ...

  5. Android TabLayout+ViewPager禁止滑动

    1.重写ViewPager并重写覆盖ViewPager的onInterceptTouchEvent(MotionEvent arg0)方法和onTouchEvent(MotionEvent arg0) ...

  6. Android利用ViewPager实现滑动广告板

    •android-support-v4.jar,这是谷歌官方 给我们提供的一个兼容低版本Android设备的软件包,里面包囊了只有在Android3.0以上可以使用的api.而ViewPager就是其 ...

  7. Android重写ViewPager改动滑动灵敏度

        使用ViewPager作为一个页面进行切换.里面能够存放非常多View,但有时在操作View时不小心滑动一下就有可能跳到下一页,这并非我们想要的,这里就须要重写ViewPager改动它的滑动条 ...

  8. Android 禁止Viewpager左右滑动功能

    首先自定义一个 继承自 ViewPager的自定义 类 package com.yourcompany; import android.content.Context; import android. ...

  9. [置顶] viewPager控制滑动速度和时间

    遇到如下问题:viewpager滑动时如果想跳过很多条直接到最后一条,中间会黑屏.黑屏是因为中间的view没有加载出来的缘故. stackOverflow上看到的解决方案,在这里记录一下, publi ...

随机推荐

  1. Getting to grips with CakePHP’s events system

    CakePHP seems to get a slightly unfavourable reputation when compared to the likes of Symfony or Zen ...

  2. js中,“\”转义字符的使用

    (1)针对双引号“”的使用: html= "<a href=\"javascript:void(0)\" onclick=\"getSubContent( ...

  3. [学习笔记—Objective-C]《Objective-C-基础教程 第2版》第九章 内存管理

    内存管理: 确保在须要的时候分配内存,在程序运行结束时释放占用的内存 假设仅仅分配内存而不释放内存,则会发生内存泄漏(leak memory),程序的内存占用量不断添加.终于会被耗尽并导致程序崩溃. ...

  4. 【VBA编程】01.第一个VBA程序Hello world

    [程序1] 所有程序语言的开始都源于Hello world,那么我们也使用Hello world进行第一个VBA编程 新建Excle文件-----文件-------选项-----自定义功能区域---- ...

  5. 跨站请求伪造解决办法之——过滤referer

    当然,referer也是可以伪造的,Http请求本身就没有不能伪造的东西. 所以本方法只能在一定程度上防止非法请求,仅供参考. 项目的web.xml中增加过滤器: <filter> < ...

  6. X86服务器、小型机、大型机、塔式、机架式、刀片式服务器、工作站

    ü  服务器分:x86(PC)服务器,小型机(Unix服务器),大型机: pc服务器则主要指基于intel处理器的x86架构,是一个通用开放的系统. UNIX服务器,也就是中国业内习惯上说的小型机,在 ...

  7. poj3177 Redundant Paths 边双连通分量

    给一个无向图,问至少加入多少条边能够使图变成双连通图(随意两点之间至少有两条不同的路(边不同)). 图中的双连通分量不用管,所以缩点之后建新的无向无环图. 这样,题目问题等效于,把新图中度数为1的点相 ...

  8. (七)Oracle学习笔记—— 游标

    1.游标简介 游标用来处理从数据库中检索的多行记录(使用SELECT语句).利用游标,程序可以逐个地处理和遍历一次检索返回的整个记录集. 为了处理SQL语句,Oracle将在内存中分配一个区域,这就是 ...

  9. RabbitMQ的应用场景以及基本原理介绍(转载)

    1.背景 RabbitMQ是一个由erlang开发的AMQP(Advanved Message Queue)的开源实现. 2.应用场景 2.1异步处理 场景说明:用户注册后,需要发注册邮件和注册短信, ...

  10. SD卡路径问题以及如何获取SDCard 内存

            昨天在研究拍照后突破的存储路径的问题,开始存储路径写死为:    private String folder = "/sdcard/DCIM/Camera/"(SD ...