@Override
public void computeScroll()
{
if (mScroller.computeScrollOffset())
{
scrollTo(0, mScroller.getCurrY());
invalidate();
}
}
ok,到此,我们的onTouchEvent搞定了~~but,别得意,为什么这么说呢?因为你完成的,知识当然View对于上下拖动的处理。大家别忘了,我们当前的StickyNavLayout内部可是有一个ScrollView的,那么根据事件的转发机制,这个内部的ScrollView肯定会处理上下拖动这种情况的,也就是我们的事件会被它拦截。
4、onInterceptTouchEvent好了,接下来我们要处理拦截,对于拦截,我们要清楚的知道什么时候应该拦截,什么时候不需要,当前我们的例子:
1、如果我们的顶部view只要没有完全隐藏,那么直接拦截上下的拖动;
2、还有个需要拦截的地方,就是当顶部的view彻底隐藏了,我们现在内部的sc应该可以上下滑动了,但是如果sc滑动到顶部再往下的时候,此时又该拦截了,我们需要把顶部view可以下滑出来。
分析完成以后,看代码,这叫一个酸爽:
@Override
public boolean onInterceptTouchEvent(MotionEvent ev)
{
int action = ev.getAction();
float y = ev.getY();
switch (action)
{
case MotionEvent.ACTION_DOWN:
mLastY = y;
break;
case MotionEvent.ACTION_MOVE:
float dy = y - mLastY;
getCurrentScrollView();
if (Math.abs(dy) > mTouchSlop)
{
mDragging = true;
if (!isTopHidden
|| (mInnerScrollView.getScrollY() == 0 && isTopHidden && dy > 0))
{
return true;
}
}
break;
}
return super.onInterceptTouchEvent(ev);
}
ok,move中判断上述两种情况,o了。
如有bug,欢迎提出。本文源码下载在下:
------------------------------------------分割线------------------------------------------
具体下载目录在 /2015年资料/2月/16日/Android 自定义控件 轻松实现360软件详情页/
------------------------------------------分割线------------------------------------------