Android重写ViewPager改动滑动灵敏度
使用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改动滑动灵敏度的更多相关文章
- Android中ViewPager实现滑动条及与Fragment结合的实例教程
ViewPager类主要被用来实现可滑动的视图功能,这里我们就来共同学习Android中ViewPager实现滑动条及与Fragment结合的实例教程,需要的朋友可以参考下 自主实现滑动指示条先上一个 ...
- Android 禁止ViewPager左右滑动的功能实现
来来来,各位看官~ Look here!!! Android 禁止ViewPager左右滑动的功能实现!! I think it`s so easy,无需重写ViewPager!!! JUST ...
- android之ViewPager修改滑动速度
在android中,使用过viewpager的人都清楚,我们如果使用viewpager进行滑动时,如果通过手指滑动来进行的话,可以根据手指滑动的距离来实现,但是如果通过setCurrentItem函数 ...
- Android TabLayout+ViewPager禁止滑动
1.重写ViewPager并重写覆盖ViewPager的onInterceptTouchEvent(MotionEvent arg0)方法和onTouchEvent(MotionEvent arg0) ...
- Android利用ViewPager实现滑动广告板
•android-support-v4.jar,这是谷歌官方 给我们提供的一个兼容低版本Android设备的软件包,里面包囊了只有在Android3.0以上可以使用的api.而ViewPager就是其 ...
- Android 禁止Viewpager左右滑动功能
首先自定义一个 继承自 ViewPager的自定义 类 package com.yourcompany; import android.content.Context; import android. ...
- Android禁止ViewPager的左右滑动
转载请注明出处:http://blog.csdn.net/allen315410/article/details/40744287 有时候在开发中会遇到一些"诡异"的要求,比方在V ...
- 114、Android禁止ViewPager的左右滑动
有时候在开发中会遇到一些“诡异”的要求,比如在ViewPager中嵌入ListView,或者再嵌入一个ViewPager,那么在滑动的时候就会造成被嵌入的XXView不能滑动了,那么现在就把最外层的V ...
- Android listview viewpager解决冲突 滑动
Android listview viewpager滑动 跳动 冲突解决 ListView中嵌套ViewPage有或者滑动手势冲突解决 在listview 上使用 addHeaderView 在第 ...
随机推荐
- zabbix监控web应用
1)web应用监控介绍 使用zabbix自带的web场景可以监控url的状态码,响应时间,url的下载速度,非常的棒 思路:定义模板-->创建应用集--->定义web场景--->定义 ...
- 【转+整理】jenkins与SonarQube集成
一.SonarQube 我的理解是,SonarQube就是一个对代码进行分析的平台,其功能可以通过插件扩展.支持多种语言,也支持静态代码检查.发现潜在bug等. 以下是参考信息: 维基百科:https ...
- UVA 11636.Hello World!-水题
Hello World! Time limit: 1.000 seconds When you first made the computer to print the sentence “Hello ...
- 训练指南 UVA - 10917(最短路Dijkstra + 基础DP)
layout: post title: 训练指南 UVA - 10917(最短路Dijkstra + 基础DP) author: "luowentaoaa" catalog: tr ...
- ZOJ 2112 Dynamic Rankings (动态第 K 大)(树状数组套主席树)
Dynamic Rankings Time Limit: 10 Seconds Memory Limit: 32768 KB The Company Dynamic Rankings has ...
- hihocoder Popular Products(STL)
Popular Products 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 Given N lists of customer purchase, your tas ...
- 24、Django实战第24天:讲师列表页
1.复制teracher-list.html到templates目录下 2.编辑teacher-list.html,继承base模板 3.编辑organization.views.py ... fro ...
- 【网络流】【Dinic】【Next Array】Dinic模板
注意:有时加边不一定要加反向弧. Next Array版. #include<cstdio> #include<cstring> #include<algorithm&g ...
- [TC-HouseProtection]House Protection
题目大意: 一个平面直角坐标系中有给定的$n(n\le50)$个红点和$m(m\le50)$个蓝点,每个点可以选择画一个半径为$r$(所有的$r$相同)的圆或不画.圆的半径上限为$R(R\le1000 ...
- 上传--下载HDFS文件并指定文件物理块的大小
使用hdfs的api接口分别实现从本地上传文件到集群和从集群下载文件到本地. 1)上传文件主要是使用FileSystem类的copyFromLocalFile()方法来实现,另外我们上传文件时可以指定 ...