package com.theroncake.view;
import android.content.Context;
import android.graphics.PointF;
import android.support.v4.view.ViewPager;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.view.View;
/**
*
* 解决了viewpager中嵌套scrollview,然后scrollview不能滑动的问题
* 当viewpager嵌套viewpager的时候,子viewpager当滑动到最后一张的时候会滑动到父viewpager的页面
* ,所以子viewpager需要自定义来重写事件
*
* @author cxj
*
*/
public class MyViewPage extends ViewPager {
private boolean scrollble = true;
public MyViewPage(Context context) {
super(context);
}
public MyViewPage(Context context, AttributeSet attrs) {
super(context, attrs);
}
PointF downPoint = new PointF();
OnSingleTouchListener onSingleTouchListener;
// onInterceptTouchEvent的定义为于ViewGroup中,默认返回值为false,表示不拦截TouchEvent
@Override
public boolean onTouchEvent(MotionEvent evt) {// 分发TouchEvent
if (!scrollble) {
return true;
}
switch (evt.getAction()) {
case MotionEvent.ACTION_DOWN:
// 记录按下时候的坐标
downPoint.x = evt.getX();
downPoint.y = evt.getY();
if (this.getChildCount() > 1) { // 有内容,多于1个时
// 通知其父控件,现在进行的是本控件的操作,不允许拦截
getParent().requestDisallowInterceptTouchEvent(true);// 拦截TouchEvent
}
break;
case MotionEvent.ACTION_MOVE:
if (this.getChildCount() > 1) { // 有内容,多于1个时
// 通知其父控件,现在进行的是本控件的操作,不允许拦截
getParent().requestDisallowInterceptTouchEvent(true);
}
break;
case MotionEvent.ACTION_UP:
// 在up时判断是否按下和松手的坐标为一个点
if (PointF.length(evt.getX() - downPoint.x, evt.getY()
- downPoint.y) < (float) 5.0) {
onSingleTouch(this);
return true;
}
break;
}
return super.onTouchEvent(evt);
}
public void onSingleTouch(View v) {
if (onSingleTouchListener != null) {
onSingleTouchListener.onSingleTouch(v);
}
}
public interface OnSingleTouchListener {
public void onSingleTouch(View v);
}
public void setOnSingleTouchListener(
OnSingleTouchListener onSingleTouchListener) {
this.onSingleTouchListener = onSingleTouchListener;
}
public boolean isScrollble() {
return scrollble;
}
public void setScrollble(boolean scrollble) {
this.scrollble = scrollble;
}
}
import android.content.Context;
import android.graphics.PointF;
import android.support.v4.view.ViewPager;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.view.View;
/**
*
* 解决了viewpager中嵌套scrollview,然后scrollview不能滑动的问题
* 当viewpager嵌套viewpager的时候,子viewpager当滑动到最后一张的时候会滑动到父viewpager的页面
* ,所以子viewpager需要自定义来重写事件
*
* @author cxj
*
*/
public class MyViewPage extends ViewPager {
private boolean scrollble = true;
public MyViewPage(Context context) {
super(context);
}
public MyViewPage(Context context, AttributeSet attrs) {
super(context, attrs);
}
PointF downPoint = new PointF();
OnSingleTouchListener onSingleTouchListener;
// onInterceptTouchEvent的定义为于ViewGroup中,默认返回值为false,表示不拦截TouchEvent
@Override
public boolean onTouchEvent(MotionEvent evt) {// 分发TouchEvent
if (!scrollble) {
return true;
}
switch (evt.getAction()) {
case MotionEvent.ACTION_DOWN:
// 记录按下时候的坐标
downPoint.x = evt.getX();
downPoint.y = evt.getY();
if (this.getChildCount() > 1) { // 有内容,多于1个时
// 通知其父控件,现在进行的是本控件的操作,不允许拦截
getParent().requestDisallowInterceptTouchEvent(true);// 拦截TouchEvent
}
break;
case MotionEvent.ACTION_MOVE:
if (this.getChildCount() > 1) { // 有内容,多于1个时
// 通知其父控件,现在进行的是本控件的操作,不允许拦截
getParent().requestDisallowInterceptTouchEvent(true);
}
break;
case MotionEvent.ACTION_UP:
// 在up时判断是否按下和松手的坐标为一个点
if (PointF.length(evt.getX() - downPoint.x, evt.getY()
- downPoint.y) < (float) 5.0) {
onSingleTouch(this);
return true;
}
break;
}
return super.onTouchEvent(evt);
}
public void onSingleTouch(View v) {
if (onSingleTouchListener != null) {
onSingleTouchListener.onSingleTouch(v);
}
}
public interface OnSingleTouchListener {
public void onSingleTouch(View v);
}
public void setOnSingleTouchListener(
OnSingleTouchListener onSingleTouchListener) {
this.onSingleTouchListener = onSingleTouchListener;
}
public boolean isScrollble() {
return scrollble;
}
public void setScrollble(boolean scrollble) {
this.scrollble = scrollble;
}
}