设为首页 加入收藏

TOP

Android 自定义控件 轻松实现360软件详情页(三)
2015-02-25 16:15:22 来源: 作者: 【 】 浏览:71
Tags:Android 定义 控件 轻松 实现 360 软件 详情
event);
? ?mLastY = y;
? ?return true;
? case MotionEvent.ACTION_MOVE:
? ?float dy = y - mLastY;


? ?if (!mDragging && Math.abs(dy) > mTouchSlop)
? ?{
? ? mDragging = true;
? ?}
? ?if (mDragging)
? ?{
? ? scrollBy(0, (int) -dy);
? ? mLastY = y;
? ?}
? ?break;
? case MotionEvent.ACTION_CANCEL:
? ?mDragging = false;
? ?if (!mScroller.isFinished())
? ?{
? ? mScroller.abortAnimation();
? ?}
? ?break;
? case MotionEvent.ACTION_UP:
? ?mDragging = false;
? ?mVelocityTracker.computeCurrentVelocity(1000, mMaximumVelocity);
? ?int velocityY = (int) mVelocityTracker.getYVelocity();
? ?if (Math.abs(velocityY) > mMinimumVelocity)
? ?{
? ? fling(-velocityY);
? ?}
? ?mVelocityTracker.clear();
? ?break;
? }


? return super.onTouchEvent(event);
?}


比较简单哈,我们因为只需要判断y方向的,所以down的时候记录下y的值,然后move的时候拿到dy,直接去进去scrollBy就好,当然我们在整个过程中.addMovement(event);所以,up的时候,我们得到v方向的velocityY,调用fling进行移动。?


还好fling的核心代码OverScroller给我们实现了,so nice。


大家应该清楚,我们使用Scroller这样的辅助类时,它们帮我们完成的,知识数学方面的计算,至于自动我们还是需要自己去干的。


那怎么干,在哪干?这个无非就是重写computeScroll方法,在里面判断scroller是否结束,如果没有,则scrollTo一下,最后记得invalidate,相关代码:


public void fling(int velocityY)
?{
? mScroller.fling(0, getScrollY(), 0, velocityY, 0, 0, 0, mTopViewHeight);
? invalidate();
?}


?@Override
?public void scrollTo(int x, int y)
?{
? if (y < 0)
? {
? ?y = 0;
? }
? if (y > mTopViewHeight)
? {
? ?y = mTopViewHeight;
? }
? if (y != getScrollY())
? {
? ?super.scrollTo(x, y);
? }


? isTopHidden = getScrollY() == mTopViewHeight;


?}


?@Override
?public void computeScroll()
?{
? if (mScroller.computeScrollOffset())
? {
? ?scrollTo(0, mScroller.getCurrY());
? ?invalidate();
? }
?}


ok,到此,我们的onTouchEvent搞定了~~but,别得意,为什么这么说呢?因为你完成的,知识当然View对于上下拖动的处理。大家别忘了,我们当前的StickyNavLayout内部可是有一个ScrollView的,那么根据事件的转发机制,这个内部的ScrollView肯定会处理上下拖动这种情况的,也就是我们的事件会被它拦截。


好了,接下来我们要处理拦截,对于拦截,我们要清楚的知道什么时候应该拦截,什么时候不需要,当前我们的例子:


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软件详情页/


------------------------------------------分割线------------------------------------------


首页 上一页 1 2 3 下一页 尾页 3/3/3
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇Android 属性动画(Property Anima.. 下一篇Android 教你打造炫酷的ViewPager..

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: