ViewPager禁止滑动和修改滑动速度

本文详细介绍如何在Android开发中自定义ViewPager的滑动速度,包括禁止ViewPager滑动、通过反射机制修改滑动速度的具体实现方法,以及如何通过创建自定义Scroller来控制页面切换动画的展示时间。
  1. 利用ViewPage的PagerTransformer定制页面切换效果
  2. ViewPager动态添加删除及刷新页面
  3. ViewPager打造真正意义的无限轮播
  4. ViewPage 联动效果自带角标
  5. ViewPager禁止滑动和修改滑动速度

1. 简介

实际开发中,我们有时候需要禁止 ViewPager 滑动,和改变 ViewPager 切换页面时的滑动速率。下面总结了 禁止ViewPager滑动和通过Viewpager 的 scroller 修改滑动速度的实现。非常简单。

2. ViewPager 禁止滑动

禁止 ViewPager 滑动,最简单的方式就是拦截 ViewPager 触摸滑动事件。如下代码所示:

import android.content.Context;
import android.support.v4.view.ViewPager;
import android.util.AttributeSet;
import android.view.MotionEvent;

public class NoScrollViewPager extends ViewPager {
   
   

    private boolean scrollable = true;

    public NoScrollViewPager(Context context, AttributeSet attrs) {
   
   
        super(context, attrs);
    }

    public NoScrollViewPager(Context context) {
   
   
        super(context);
    }

    public void setScrollable(boolean scrollable) {
   
   
        this.scrollable = scrollable;
    }

    public boolean isScrollable() {
   
   
        return scrollable;
    }

    @Override
    public boolean onTouchEvent(MotionEvent ev) {
   
   
        if (scrollable) {
   
   
            return super.onTouchEvent(ev);
        } else {
   
   
            return false;
        }
    }

    @Override
    public boolean onInterceptTouchEvent(MotionEvent ev) {
   
   
        if (scrollable) {
   
   
            return super.onInterceptTouchEvent(ev);
        } else {
   
   
            return false;
        }
    }
}

使用时,调用 setScrollable(false) 就可以禁止 ViewPager 滑动。

3. ViewPager 修改滑动速度

我们都知道,ViewPager 切换页面有两种方式:一是,手指触摸滑动切换页面;二是,调用方法 setCurrentItem(int) 切换页面。用手指触摸滑动切换页面时,页面的滑动与手指滑动速度有关,过渡动画很明显,体验很好。调用方法切换页面时,由于页面切换速度较快,过渡动画不明显甚至没有,往往是直接闪过去。当我们需要 ViewPager 自动切换页面,例如自动轮播时,ViewPager 原有的切换速度有时候难以适应我们的需求,尤其在我们定制了 ViewPager 的切换效果时,就更加难以适应我们对交互体验的需求了。这时我们就需要修改这种情况下页面滑动速度了。如何修改页面切换速度呢?咱们深入了解一下 ViewPager。

首先,我们看一下 setCurrentItem(int) 方法的源码:

public void setCurrentItem(int item) {
   
   
    mPopulatePending = false;
    setCurrentItemInternal(item, !mFirstLayout, false);
}

调用了 setCurrentItemInternal(int, boolean, boolean) 方法,再看 setCurrentItemInternal(int, boolean, boolean) 方法;

void setCurrentItemInternal(int item, boolean smoothScroll, boolean always) {
   
   
	setCurrentItemInternal(item, smoothScroll, always, 0);
}

继续往下看:

    void setCurrentItemInternal(int item
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值