您的位置:首页 > 移动开发 > Android开发

Android ViewPager的嵌套使用

2015-09-01 09:56 465 查看

ViewPager的嵌套使用会涉及到事件传递的处理。

不能滑动的ViewPager

package com.itheima.zhbj48.view;

import android.content.Context;
import android.support.v4.view.ViewPager;
import android.util.AttributeSet;
import android.view.MotionEvent;

/**
* 不能滑动的ViewPager
*/
public class NoScrollViewPager extends ViewPager {

public NoScrollViewPager(Context context, AttributeSet attrs) {
super(context, attrs);
}

public NoScrollViewPager(Context context) {
super(context);
}

// 事件分发
@Override
public boolean dispatchTouchEvent(MotionEvent ev) {
return super.dispatchTouchEvent(ev);
}

/**
* 事件拦截
*
* 返回false, 表示不拦截触摸事件,让子控件有机会响应事件, 用于ViewPager嵌套ViewPager时使用
*/
@Override
public boolean onInterceptTouchEvent(MotionEvent ev) {
return false;
}

/**
* 拦截所有的触摸事件, 不做任何处理
*/
@Override
public boolean onTouchEvent(MotionEvent ev) {
return true;
}
}

头条新闻横向滑动的ViewPager

package com.itheima.zhbj48.view;

import android.content.Context;
import android.support.v4.view.ViewPager;
import android.util.AttributeSet;
import android.view.MotionEvent;

/**
* 头条新闻横向滑动的ViewPager
*/
public class HorizontalScrollViewPager extends ViewPager {

private int startX;
private int startY;

public HorizontalScrollViewPager(Context context, AttributeSet attrs) {
super(context, attrs);
}

public HorizontalScrollViewPager(Context context) {
super(context);
}

/**
* 1. 当右划时,而且当前item是第一个,需要父控件拦截; 2. 当左划时,当前item是最后一个,需要父控件拦截; 3. 当上下划动时,
* 需要父控件拦截
*/
@Override
public boolean dispatchTouchEvent(MotionEvent ev) {
switch (ev.getAction()) {
case MotionEvent.ACTION_DOWN:
getParent().requestDisallowInterceptTouchEvent(true);// 请求父控件,以及祖宗控件,不要拦截我的事件,
startX = (int) ev.getX();
startY = (int) ev.getY();
break;
case MotionEvent.ACTION_MOVE:
int endX = (int) ev.getX();
int endY = (int) ev.getY();

int dx = endX - startX;
int dy = endY - startY;

// 判断是否是左右划
if (Math.abs(dx) > Math.abs(dy)) {// 左右滑动

if (dx > 0) {// 向右滑动
if (getCurrentItem() == 0) {// 当前item是第一个
getParent().requestDisallowInterceptTouchEvent(false);// 父控件可以拦截事件
}
} else {
if (getCurrentItem() == getAdapter().getCount() - 1) {// 当前item是最后一个
getParent().requestDisallowInterceptTouchEvent(false);// 父控件可以拦截事件
}
}

} else {
getParent().requestDisallowInterceptTouchEvent(false);// 父控件可以拦截事件
}
break;
default:
break;
}

return super.dispatchTouchEvent(ev);
}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: