使用ViewPager作为一个页面进行切换,里面可以存放很多View,但有时在操作View时不小心滑动一下就有可能跳到下一页,这并不是我们想要的,这里就需要重写ViewPager修改它的滑动条件
效果图
程序目录结构
BTViewPager.java
-
packagecom.example.viewpagerdemo;
-
-
importandroid.content.Context;
-
importandroid.support.v4.view.ViewPager;
-
importandroid.util.AttributeSet;
-
importandroid.util.Log;
-
importandroid.view.MotionEvent;
-
importandroid.widget.Scroller;
-
-
-
-
-
-
-
-
publicclassBTViewPagerextendsViewPager{
-
-
privatestaticfinalStringTAG="dzt_pager";
-
privatestaticfinalintMOVE_LIMITATION=100;
-
privatefloatmLastMotionX;
-
privateintmCurScreen;
-
-
privateScrollermScroller;
-
-
publicBTViewPager(Contextcontext){
-
super(context);
-
-
init(context);
-
}
-
-
publicBTViewPager(Contextcontext,AttributeSetattrs){
-
super(context,attrs);
-
-
init(context);
-
}
-
-
privatevoidinit(Contextcontext){
-
mScroller=newScroller(context);
-
mCurScreen=0;
-
}
-
-
@Override
-
publicbooleanonTouchEvent(MotionEventevent){
-
-
-
finalintaction=event.getAction();
-
finalfloatx=event.getX();
-
switch(action){
-
caseMotionEvent.ACTION_DOWN:
-
Log.d(TAG,"[BTViewPager->]onTouchEventACTION_DOWN");
-
mLastMotionX=x;
-
break;
-
caseMotionEvent.ACTION_MOVE:
-
Log.d(TAG,"[BTViewPager->]onTouchEventACTION_MOVE");
-
break;
-
caseMotionEvent.ACTION_UP:
-
Log.d(TAG,"Item="+getCurrentItem()+"count="
-
+getChildCount());
-
-
if(Math.abs(x-mLastMotionX)<MOVE_LIMITATION){
-
-
snapToScreen(getCurrentItem());
-
returntrue;
-
}
-
break;
-
default:
-
break;
-
}
-
Log.d(TAG,"[BTViewPager->]onTouchEvent--end");
-
returnsuper.onTouchEvent(event);
-
}
-
-
@Override
-
publicvoidcomputeScroll(){
-
-
Log.d(TAG,"[BTViewPager->]computeScroll");
-
super.computeScroll();
-
-
if(mScroller.computeScrollOffset()){
-
Log.d(TAG,
-
"[BTViewPager->]computeScrollx="+mScroller.getCurrX());
-
scrollTo(mScroller.getCurrX(),mScroller.getCurrY());
-
invalidate();
-
}
-
-
}
-
-
-
-
-
publicvoidsnapToDestination(){
-
finalintscreenWidth=getWidth();
-
finalintdestScreen=(getScrollX()+screenWidth/2)/screenWidth;
-
Log.d(TAG,"[BTViewPager->]snapToDestinationscreenWidth="
-
+screenWidth+"destScreen="+destScreen);
-
snapToScreen(destScreen);
-
}
-
-
-
-
-
-
-
-
publicvoidsnapToScreen(intwhichScreen){
-
-
-
if(getScrollX()!=(whichScreen*getWidth())){
-
-
finalintdelta=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();
-
}
-
}
-
-
-
-
-
-
-
@Override
-
publicbooleanonInterceptTouchEvent(MotionEventarg0){
-
-
Log.d(TAG,"[BTViewPager->]onInterceptTouchEvent");
-
finalintaction=arg0.getAction();
-
finalfloatx=arg0.getX();
-
switch(action){
-
caseMotionEvent.ACTION_DOWN:
-
Log.d(TAG,"onInterceptTouchEvent---ACTION_DOWN");
-
mLastMotionX=x;
-
break;
-
caseMotionEvent.ACTION_MOVE:
-
Log.d(TAG,"onInterceptTouchEvent---ACTION_MOVE");
-
break;
-
caseMotionEvent.ACTION_UP:
-
Log.d(TAG,"onInterceptTouchEvent---ACTION_UP");
-
break;
-
default:
-
break;
-
}
-
returnsuper.onInterceptTouchEvent(arg0);
-
}
-
}
只要是在onTouchEvent的UP中处理滑动的条件
-
if(Math.abs(x-mLastMotionX)<MOVE_LIMITATION){
-
-
snapToScreen(getCurrentItem());
-
returntrue;
-
}
只有滑动的距离大于100才进行上下页处理,否则就停在当前页,当前页使用getCurrentItem()获取,有一点要注意在ViewPager中getChildCount()获取的值是错误的,不清楚是什么原因,在ViewGroup中是有效的,这个可能要查看ViewPager源码才能弄清楚是什么原因,有知道的朋友可以告知我!完整Demo:http://download.csdn.net/detail/deng0zhaotai/7384637
分享到:
相关推荐
使用ViewPager作为一个页面进行切换,里面可以存放很多View,但有时在操作View时不小心滑动一下就有可能跳到下一页,这并不是我们想要的,这里就需要重写ViewPager修改它的滑动条件
Android listview viewpager 滑动 跳动 冲突解决 ListView中嵌套ViewPage有或者滑动手势冲突解决 blog 地址 : http://blog.csdn.net/aaawqqq/article/details/43824631
一款android viewpager 自定义滑动动画效果,很多种效果有你想要的,还可以理解之后自己写出自己想要的效果,很简单,调用就一段代码,不影响性能
Android ViewPager实现仿QQ多页面滑动切换以及动画效果
主要介绍了ViewPager滑动灵敏度调整的方法实力,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
Android ViewPager 图片无限滑动和根据图片数量自动生成的小圆点
Android利用ViewPager实现类微信的左右滑动效果,详细代码注解解析setOnPageChangeListener各参数意义以及使用方法
咋一看是实现了ViewPager的循环滑动,其中还解决了一个小于等于三张时报错的一个bug
用viewPager实现在页面左右滑动的同时 动态光标 一条用来指示当前页面是viewPager的哪一个页面的横线 实现动态的滑动效果 类似与微信经典界面
自己写的一个基于viewpager 的页面滑动效果,可以无限的左右滑动。
Android ViewPager左右滑动翻页。 适用于,第一次安装应用时的新手指导,及图片推荐浏览等。
继承ViewPager,重写方法,实现左右无法滑动的效果。详情可以看下博客。
仿微博的左右滑动 主要利用了android的ViewPager
Androidfragment结合viewpager的滑动与点击,简单的小demo,包含xml数据解析,sqllite,动态权限等
Android ViewPager+Fragment,ViewPager标示跟着ViewPager滑动而同时滑动
Android - ViewPager滑动广告栏源码, 自动切换, 自动适配ViewPager, 不会出现ViewPager占满全屏的情况
Android重写HorizontalScrollView仿ViewPager效果
android ViewPager自动滑动(广告栏效果)
一个效果不错的FragmentViewPager底部滑动导航效果,做的很全面可以直接下载使用。(FragmentViewPager点击选择+滑动选择)