本文类型写成原创,多少有点感觉良心不安,毕竟这是通过大牛的例子综合而成,而此次修改,算是狗尾续貂,总之希望能帮到有此需求的同仁。
该例适用于客户端的首页,标题想了半天也没能用一句话来概述,只能用几个关键字链接来表此意,可能有的朋友仍然不好理解,直接上图先:
主要功能点是各种touch的处理、焦点传递问题,如
@Override
public boolean onInterceptTouchEvent(MotionEvent event) {
int intercepted = 0;
int x = (int) event.getX();
int y = (int) event.getY();
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN: {
mLastXIntercept = x;
mLastYIntercept = y;
mLastX = x;
mLastY = y;
intercepted = 0;
break;
}
case MotionEvent.ACTION_MOVE: {
int deltaX = x - mLastXIntercept;
int deltaY = y - mLastYIntercept;
if (isTop) {
// 向下滑动
if (deltaY > 0) {
// 如果listview已经滑动了很多条码,则优先把listview滑动到最上面
if (mPullDownTemplateView.pullDownView.getListView()
.getFirstVisiblePosition() != 0) {
intercepted = 0;
} else {
intercepted = 1;
}
} else {
// 向上滑动
intercepted = 0;
}
} else {
// 向下滑动
if (deltaY >= 0) {
intercepted = 0;
} else {
// 向上滑动
intercepted = 1;
}
}
// if (mStatus == STATUS_EXPANDED && deltaY <= -mTouchSlop) {
// intercepted = 1;
// } else if (mGiveUpTouchEventListener != null) {
// if (mGiveUpTouchEventListener.giveUpTouchEvent(event)
// && deltaY >= mTouchSlop) {
// intercepted = 1;
// }
// }
break;
}
case MotionEvent.ACTION_UP: {
intercepted = 0;
mLastXIntercept = mLastYIntercept = 0;
break;
}
default:
break;
}
// 返回true表示焦点不向下(子)传递,返回false表示传给子布局
Log.d(TAG, "intercepted=" + intercepted);
return intercepted != 0;
}
该项目还可以进一步细化,把顶部的ImageView改成ViewPager,注意的是,仍需要自定义Viewpager,重写onTouchEvent(MotionEvent evt)
@Override
public boolean onTouchEvent(MotionEvent evt) {
switch (evt.getAction()) {
case MotionEvent.ACTION_DOWN:
// 记录按下时候的坐标
downPoint.x = evt.getX();
downPoint.y = evt.getY();
if (this.getChildCount() > 1) { //有内容,多于1个时
// 通知其父控件,现在进行的是本控件的操作,不允许拦截
getParent().requestDisallowInterceptTouchEvent(true);
}
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);
}
源码地址 http://download.csdn.net/detail/zhangyaobin_1989/8628607