使用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. mysql管理和基本操作

    进去mysql:mysql –uroot –p 重启数据库:[root@nanaLinux ~]# /etc/init.d/mysqld restart 1.Mysql忘记root密码 // 查看my ...

  2. KVM(八)使用 libvirt 迁移 QEMU/KVM 虚机和 Nova 虚机

    1. QEMU/KVM 迁移的概念 迁移(migration)包括系统整体的迁移和某个工作负载的迁移.系统整理迁移,是将系统上所有软件包括操作系统完全复制到另一个物理机硬件机器上.虚拟化环境中的迁移, ...

  3. ubuntu 16.04安装redis(源码安装)zz

    本文转载自: http://www.linuxdiyf.com/linux/22527.html Redis是一个开源的使用ANSI C语言编写.支持网络.可基于内存亦可持久化的日志型.Key-Val ...

  4. poj 1066(枚举+线段相交)

    Treasure Hunt Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 6328   Accepted: 2627 Des ...

  5. lua返回服务器信息

    ngx.header.content_type = "text/plain"; ngx.say(tostring(ngx.var.request_uri));ngx.say(tos ...

  6. 浙江省第十二届省赛 B - Team Formation

    Description For an upcoming programming contest, Edward, the headmaster of Marjar University, is for ...

  7. Mathematica作图

    第2讲 在Mathematica中作图    一个较强的符号计算系统均有很好的绘图功能,Mathematica也不例外,Mathematica 拥有非常强大的绘图功能.并且提供了一大批基本数学函数的图 ...

  8. HDU 1711 Number Sequence【kmp求子串首次出现的位置】

      Given two sequences of numbers : a[1], a[2], ...... , a[N], and b[1], b[2], ...... , b[M] (1 <= ...

  9. Maven学习笔记2

    Maven安装配置 1.下载Maven 官方地址:http://maven.apache.org/download.cgi 将下载的压缩包解压到你要安装 Maven 的文件夹.假设你解压缩到文件夹 – ...

  10. 服务认证暴力破解工具Crowbar

    服务认证暴力破解工具Crowbar   Crowbar是Kali Linux新增的一款服务认证暴力破解工具.该工具支持OpenVPN.RDP.SSH和VNC服务.该工具具备常见的暴力破解功能,如主机字 ...