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

效果图

程序文件夹结构

BTViewPager.java

package com.example.viewpagerdemo;

import android.content.Context;
import android.support.v4.view.ViewPager;
import android.util.AttributeSet;
import android.util.Log;
import android.view.MotionEvent;
import android.widget.Scroller; /**
* 解决ViewPager滑动过于灵敏,仅仅有滑动距离大于100才滑到还有一页
*
* @author Administrator
*
*/
public class BTViewPager extends ViewPager { private static final String TAG = "dzt_pager";
private static final int MOVE_LIMITATION = 100;// 触发移动的像素距离
private float mLastMotionX; // 手指触碰屏幕的最后一次x坐标
private int mCurScreen; private Scroller mScroller; // 滑动控件 public BTViewPager(Context context) {
super(context);
// TODO Auto-generated constructor stub
init(context);
} public BTViewPager(Context context, AttributeSet attrs) {
super(context, attrs);
// TODO Auto-generated constructor stub
init(context);
} private void init(Context context) {
mScroller = new Scroller(context);
mCurScreen = 0;// 默认设置显示第一个VIEW
} @Override
public boolean onTouchEvent(MotionEvent event) {
// TODO Auto-generated method stub final int action = event.getAction();
final float x = event.getX();
switch (action) {
case MotionEvent.ACTION_DOWN:
Log.d(TAG, "[BTViewPager->]onTouchEvent ACTION_DOWN");
mLastMotionX = x;
break;
case MotionEvent.ACTION_MOVE:
Log.d(TAG, "[BTViewPager->]onTouchEvent ACTION_MOVE");
break;
case MotionEvent.ACTION_UP:
Log.d(TAG, "Item = " + getCurrentItem() + " count = "
+ getChildCount()); if (Math.abs(x - mLastMotionX) < MOVE_LIMITATION) {
// snapToDestination(); // 跳到指定页
snapToScreen(getCurrentItem());
return true;
}
break;
default:
break;
}
Log.d(TAG, "[BTViewPager->]onTouchEvent--end");
return super.onTouchEvent(event);
} @Override
public void computeScroll() {
// TODO Auto-generated method stub
Log.d(TAG, "[BTViewPager->]computeScroll");
super.computeScroll(); if (mScroller.computeScrollOffset()) {
Log.d(TAG,
"[BTViewPager->]computeScroll x = " + mScroller.getCurrX());
scrollTo(mScroller.getCurrX(), mScroller.getCurrY());
invalidate();
} } /**
* 依据滑动的距离推断移动到第几个视图
*/
public void snapToDestination() {
final int screenWidth = getWidth();
final int destScreen = (getScrollX() + screenWidth / 2) / screenWidth;
Log.d(TAG, "[BTViewPager->]snapToDestination screenWidth = "
+ screenWidth + " destScreen = " + destScreen);
snapToScreen(destScreen);
} /**
* 滚动到制定的视图
*
* @param whichScreen
* 视图下标
*/
public void snapToScreen(int whichScreen) {
// whichScreen = Math.max(0, Math.min(whichScreen, getChildCount() -
// 1));
if (getScrollX() != (whichScreen * getWidth())) { final int delta = whichScreen * getWidth() - getScrollX();
Log.d(TAG, "[BTViewPager->]snapToScreen-whichScreen = "
+ whichScreen + " delta = " + delta + " scrollX = "
+ getScrollX());
mScroller.startScroll(getScrollX(), 0, delta, 0,
Math.abs(delta) * 2);
mCurScreen = whichScreen;
invalidate();
}
} /**
* 用于拦截手势事件的,每一个手势事件都会先调用这种方法。Layout里的onInterceptTouchEvent默认返回值是false,
* 这样touch事件会传递到childview控件 ,假设返回false子控件能够响应。否则了控件不响应。这里主要是拦截子控件的响应。
* 对ViewGroup无论返回值是什么都会运行onTouchEvent
*/
@Override
public boolean onInterceptTouchEvent(MotionEvent arg0) {
// TODO Auto-generated method stub
Log.d(TAG, "[BTViewPager->]onInterceptTouchEvent");
final int action = arg0.getAction();
final float x = arg0.getX();
switch (action) {
case MotionEvent.ACTION_DOWN:
Log.d(TAG, "onInterceptTouchEvent---ACTION_DOWN ");
mLastMotionX = x;
break;
case MotionEvent.ACTION_MOVE:
Log.d(TAG, "onInterceptTouchEvent---ACTION_MOVE ");
break;
case MotionEvent.ACTION_UP:
Log.d(TAG, "onInterceptTouchEvent---ACTION_UP ");
break;
default:
break;
}
return super.onInterceptTouchEvent(arg0);
}
}

仅仅要是在onTouchEvent的UP中处理滑动的条件

if (Math.abs(x - mLastMotionX) < MOVE_LIMITATION) {
// snapToDestination(); // 跳到指定页
snapToScreen(getCurrentItem());
return true;
}

仅仅有滑动的距离大于100才进行上下页处理,否则就停在当前页,当前页使用getCurrentItem()获取,有一点要注意在ViewPager中getChildCount()获取的值是错误的,不清楚是什么原因,在ViewGroup中是有效的,这个可能要查看ViewPager源代码才干弄清楚是什么原因。有知道的朋友能够告知我。
完整Demo:http://download.csdn.net/detail/deng0zhaotai/7384637

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. android之ViewPager修改滑动速度

    在android中,使用过viewpager的人都清楚,我们如果使用viewpager进行滑动时,如果通过手指滑动来进行的话,可以根据手指滑动的距离来实现,但是如果通过setCurrentItem函数 ...

  4. Android TabLayout+ViewPager禁止滑动

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

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

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

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

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

  7. Android禁止ViewPager的左右滑动

    转载请注明出处:http://blog.csdn.net/allen315410/article/details/40744287 有时候在开发中会遇到一些"诡异"的要求,比方在V ...

  8. 114、Android禁止ViewPager的左右滑动

    有时候在开发中会遇到一些“诡异”的要求,比如在ViewPager中嵌入ListView,或者再嵌入一个ViewPager,那么在滑动的时候就会造成被嵌入的XXView不能滑动了,那么现在就把最外层的V ...

  9. Android listview viewpager解决冲突 滑动

    Android listview viewpager滑动 跳动 冲突解决 ListView中嵌套ViewPage有或者滑动手势冲突解决   在listview 上使用 addHeaderView 在第 ...

随机推荐

  1. 发布message给其他包使用

    https://answers.ros.org/question/65716/which-is-the-correct-way-to-install-header-files-in-catkin-pa ...

  2. 如何在qt中使用中文输入法

    参考: http://blog.csdn.net/u013812682/article/details/52101088 dpkg -L fcitx-frontend-qt5 到qt安装目录里find ...

  3. AC日记——逆序对 洛谷 P1908

    逆序对 思路: 线段树水过: 代码: #include <cstdio> #include <cstring> #include <iostream> #inclu ...

  4. STL模板整理 pair

    pair pair是一种模板类型,其中包含两个数据值,两个数据的类型可以不同.如果一个函数有两个返回值的话,如果是相同类型,就可以用数组返回,如果是不同类型,就可以自己写个struct ,但为了方便就 ...

  5. [scrapy] spider object has no attribute '_rules'

    这是因为__init__方法没有继承父类 解决办法: # -*- coding:utf-8 -*- from selenium import webdriver from scrapy.contrib ...

  6. python 面向对象(成员,静态,类)的(变量,方法)区别

    静态方法是使用@staticmethod装饰的方法,并且参数表中不需要self或者cls,可以访问类成员变量 默认的方法是有self的,是成员方法,可以访问私有变量和方法(通过self.xxx),或者 ...

  7. 【匈牙利算法】BZOJ1059-[ZJOI2007]矩阵游戏

    [题目大意] 给出一个局部染色的矩阵,问能否通过交换行或者列使得最后又一条对角线全部被染色过? [思路] 无论如何交换,同一行的格子依然在同一行,同一列的格子依然在同一列.所以只需找出n个行号列号均不 ...

  8. Java多线程——AQS框架源码阅读

    AQS,全称AbstractQueuedSynchronizer,是Concurrent包锁的核心,没有AQS就没有Java的Concurrent包.它到底是个什么,我们来看看源码的第一段注解是怎么说 ...

  9. u-boot中添加mtdparts支持以及Linux的分区设置

    简介 作者:彭东林 邮箱:pengdonglin137@163.com u-boot版本:u-boot-2015.04 Linux版本:Linux-3.14 硬件平台:tq2440, 内存:64M   ...

  10. docker 实现redis集群搭建

    摘要:接触docker以来,似乎养成了一种习惯,安装什么应用软件都想往docker方向做,今天就想来尝试下使用docker搭建redis集群. 首先,我们需要理论知识:Redis Cluster是Re ...