8.滑动事件处理

上面是三个viewPager相互嵌套,这么就需要对滑动事件进行处理

  • 首先我们不需要viewpager1滑动,因为每次滑动的时候它的父控件就拦截了它的事件,侧边栏的每次滑的时候就跑了出来,所以这里是这样处理的:使用自定义viewpager,重写它的方法
   /**	 * 重写onTouchEvent事件,什么都不用做,不能滑动	 */	@Override	public boolean onTouchEvent(MotionEvent arg0) {		return false;	}
  • viewpager2在1里面,2想滑动,可是1却是不能滑动,把2的滑动事件拦截了,所以2也不能滑动了,这里还是重写1的自定义viewpager
	// 表示事件是否拦截, 返回false表示不拦截, 可以让嵌套在内部的viewpager相应左右划的事件	@Override	public boolean onInterceptTouchEvent(MotionEvent arg0) {		return false;	}

接下来2使用自定义viewpager,在第一个页面的时候让父控件拦截,即显示出侧边栏,但是3的话是不拦截,让侧边栏不显示出来,这样的话就相互矛盾了,到底是拦截还是不拦截了?

/** * 11个子页签水平滑动的Viewpager, 暂时不用 *  * @author Kevin *  */public class HorizontalViewPager extends ViewPager {	public HorizontalViewPager(Context context, AttributeSet attrs) {		super(context, attrs);	}	public HorizontalViewPager(Context context) {		super(context);	}	/**	 * 事件分发, 请求父控件及祖宗控件是否拦截事件	 */	@Override	public boolean dispatchTouchEvent(MotionEvent ev) {		if (getCurrentItem() != 0) {			getParent().requestDisallowInterceptTouchEvent(true);// 用getParent去请求,																	// 不拦截		} else {// 如果是第一个页面,需要显示侧边栏, 请求父控件拦截			getParent().requestDisallowInterceptTouchEvent(false);// 拦截		}		return super.dispatchTouchEvent(ev);	}}

所以不能按上面的第二步这样写,我们既想北京出来,又不想让北京出来

修改:菜单详情页-新闻(viewpager1),以前是通过HorizontalViewPager 来控制,而上面图片的那个类也不能那样写了,看最后一个

	// mViewPager.setOnPageChangeListener(this);//注意:当viewpager和Indicator绑定时,		// 滑动监听需要设置给Indicator而不是viewpager		mIndicator.setOnPageChangeListener(this);
@Override	public void onPageSelected(int arg0) {		System.out.println("onPageSelected:" + arg0);		MainActivity mainUi = (MainActivity) mActivity;		SlidingMenu slidingMenu = mainUi.getSlidingMenu();		if (arg0 == 0) {//只有在第一个页面(北京), 侧边栏才允许出来			slidingMenu.setTouchModeAbove(SlidingMenu.TOUCHMODE_FULLSCREEN);		} else {			slidingMenu.setTouchModeAbove(SlidingMenu.TOUCHMODE_NONE);		}	}
  • 接下写了indicate,可是发现indicate滑的时候会把侧边栏拉出来,因为侧边栏把它的滑动事件拦截了。修改indicate的源码TabPageIndicator.java
	/**	 * 事件分发, 请求父控件及祖宗控件不要拦截事件	 */	@Override	public boolean dispatchTouchEvent(MotionEvent ev) {		getParent().requestDisallowInterceptTouchEvent(true);// 用getParent去请求		return super.dispatchTouchEvent(ev);	}
  • viewpager3会滑到头或尾不能划了,可是我们不想要这种效果,自定义viewpager
/** * 头条新闻的Viewpager */public class TopNewsViewPager extends ViewPager {	int startX;	int startY;	public TopNewsViewPager(Context context, AttributeSet attrs) {		super(context, attrs);	}	public TopNewsViewPager(Context context) {		super(context);	}	/**	 * 事件分发, 请求父控件及祖宗控件是否拦截事件 1. 右划, 而且是第一个页面, 需要父控件(mainactivity)拦截,菜单就出来了 2. 左划, 而且是最后一个页面, 需要父控件(viewpager2)拦截,会滑动2的下一个页面	 * 3. 上下滑动, 需要父控件拦截	 */	@Override	public boolean dispatchTouchEvent(MotionEvent ev) {		switch (ev.getAction()) {		case MotionEvent.ACTION_DOWN:(滑动停止的时候)			getParent().requestDisallowInterceptTouchEvent(true);// 不要拦截,																	// 这样是为了保证ACTION_MOVE调用			startX = (int) ev.getRawX();			startY = (int) ev.getRawY();			break;		case MotionEvent.ACTION_MOVE:(滑动的时候)			int endX = (int) ev.getRawX();			int endY = (int) ev.getRawY();			if (Math.abs(endX - startX) > Math.abs(endY - startY)) {// 左右滑动				if (endX > startX) {// 右划					if (getCurrentItem() == 0) {// 第一个页面, 需要父控件拦截						getParent().requestDisallowInterceptTouchEvent(false);					}				} else {// 左划					if (getCurrentItem() == getAdapter().getCount() - 1) {// 最后一个页面,																			// 需要拦截						getParent().requestDisallowInterceptTouchEvent(false);					}				}			} else {// 上下滑动				getParent().requestDisallowInterceptTouchEvent(false);			}			break;		default:			break;		}		return super.dispatchTouchEvent(ev);	}}

 MotionEvent中getX()和getRawX()的区别

getX是获取以widget左上角为坐标原点计算的X轴坐标直. getRawX 获取的是以屏幕左上角为坐标原点计算的X轴坐标直.

当你触到按钮时,x,y是相对于该按钮左上点的相对位置。而rawx,rawy始终是相对于屏幕的位置。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏向治洪

仿支付宝手势密码

这篇来分享一下绘制手势密码的实现(主要是设置手势密码、校验手势密码): 一、大致界面介绍: ? ?                        图1  ...

29770
来自专栏Android干货园

Android自定义下拉刷新动画--仿百度外卖下拉刷新

版权声明:本文为博主原创文章,转载请标明出处。 https://blog.csdn.net/lyhhj/article/details/51...

14930
来自专栏Android干货园

Android--仿淘宝商品详情(继续拖动查看详情)及标题栏渐变

版权声明:本文为博主原创文章,转载请标明出处。 https://blog.csdn.net/lyhhj/article/details/80...

15910
来自专栏何俊林

DragVideo,一种在播放视频时,可以任意拖拽的方案

前言:项目已开源到我的github,点击【阅读原文】可以对应github地址。 DragVideo A Method to Drag the Video Wh...

37170
来自专栏三流程序员的挣扎

Android 透明状态栏(伪沉浸式)

而由于 Android API 的不同,需要考虑 4.4、5.0、6.0 前后的不同。

75920
来自专栏分享达人秀

ViewPager轻松完成TabHost效果

上一期学习了ViewPager的简单使用,本期一起来学习ViewPager的更多用法。 ? 相信很多同学都使用过今日头条APP吧,一打开主界面就...

31770
来自专栏Android源码框架分析

三句代码创建全屏Dialog或者DialogFragment:带你从源码角度实现全屏Dialog

Dialog是APP开发中常用的控件,同Activity类似,拥有独立的Window窗口,但是Dialog跟Activity还是有一定区别的,最明显的就是:默认...

44140
来自专栏程序员叨叨叨

【Android】手把手教你上滑解锁的效果

最近,公司开发的APP中要实现类似上滑解锁效果的推荐页,捣腾了两天,基本实现了效果,附效果图如上。接下来和大家聊聊如何实现这样的效果。

58020
来自专栏三好码农的三亩自留地

教你搞定Android自定义ViewGroup

我们知道ViewGroup就是View的容器类,我们经常用的LinearLayout,RelativeLayout等都是ViewGroup的子类,因为ViewG...

8510
来自专栏Android相关

RecyclerView的NestedScroll实现

16820

扫码关注云+社区

领取腾讯云代金券