参考文章:
http://www.jianshu.com/p/87a41b8c0dd0
http://www.jianshu.com/p/8bc0765dffc9
强烈推荐使用以上两篇文章的方法。
以下是我个人在项目中的解决方案,比较LOW,现在不建议使用,但可作为一种知识参考。
本人自己以前都是重写ScrollView,ListView,在onTouch方法中判断触点落在谁身上,然后把时间传给谁。具体代码,以ScrollView嵌套ViewPager为例:
public class MaintainArchScrollView extends ScrollView {
public MaintainArchScrollView(Context context) {
super(context);
}
public MaintainArchScrollView(Context context, AttributeSet attrs) {
super(context, attrs);
}
public MaintainArchScrollView(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
}
@Override
public boolean onInterceptTouchEvent(MotionEvent ev) {
// 判断触摸事件是否落在XListView上,如果是则不让
// ScrollView滑动,以免影响XListView的滑动
xLV = (XListView) findViewById(R.id.maintain_archives_lv);
if (isTouchOnLv(ev)&&xLV.isCanPullDownOnTop()&&xLV.isCanPullUpOnbottom()) {
return false;
}
//
return super.onInterceptTouchEvent(ev);
}
private boolean isTouchOnWheelMenu(MotionEvent ev) {
// 判断触摸事件是否落在WheelMenu上,如果是则不让
// ScrollView滑动,以免影响WheelMenu的手动滑动
PieChartView vp = (PieChartView) findViewById(R.id.maintain_archives_wheelMenu);
if (vp == null)
return false;
int w = vp.getHeight();
int[] xy = new int[2];
float rawY = ev.getRawY();
vp.getLocationInWindow(xy);
return rawY >= xy[1] && rawY <= (xy[1]) + w;
}
private XListView xLV;
private boolean isTouchOnLv(MotionEvent ev) {
if (xLV == null)
return false;
int w = xLV.getHeight();
int[] xy = new int[2];
float rawY = ev.getRawY();
xLV.getLocationInWindow(xy);
return rawY >= xy[1] && rawY <= (xy[1]) + w;
}