现在我们来实现一个这样的效果: 屏幕向右滑动超过二分之一屏幕宽度时,松手时,activity从右边滑出;当不够二分之一时,松手之后按,activity回到原来的位置:
首先就是OnTouchEvent了,里面很简单就一个move 和up
@Override public boolean onTouchEvent(MotionEvent event) { switch (event.getAction()) { case MotionEvent.ACTION_MOVE: int moveX = (int) event.getRawX(); int deltaX = tempX - moveX; tempX = moveX; if (moveX - downX > mTouchSlop && Math.abs((int) event.getRawY() - downY) < mTouchSlop) { Log.e("fc", "ontouch if(move)"); isSilding = true; } if (moveX - downX >= 0 && isSilding&&allowslide_flage) { mContentView.scrollBy(deltaX, 0);//activity跟随手指滑动 } break; case MotionEvent.ACTION_UP: isSilding = false; if (mContentView.getScrollX() <= -viewWidth / 2) { isFinish = true; scrollRight(); } else { scrollOrigin(); isFinish = false; } break; } return true; }
/** * 滚动出界面 */ private void scrollRight() { final int delta = (viewWidth + mContentView.getScrollX()); Log.e("delta====> ",delta+""); // 调用startScroll方法来设置一些滚动的参数,我们在computeScroll()方法中调用scrollTo来滚动item mScroller.startScroll(mContentView.getScrollX(), 0, -delta + 1, 0, Math.abs(delta)); postInvalidate(); } /** * 滚动到起始位置 */ private void scrollOrigin() { int delta = mContentView.getScrollX(); Log.e("delta====> ",delta+""); mScroller.startScroll(mContentView.getScrollX(), 0, -delta, 0, Math.abs(delta)); postInvalidate(); }接下了我们要重写computeScroll()方法,若不重写该方法,activity只会跟着手指动,松手之后停在那不会自己右滑退出或滚到起始位置,因为在上面我们虽然 startScroll了,但其实这只是Scroll动了,contentview 却没跟上他的脚步,没有动,所以下面重写computescroll 让contentview跟着scroll一起滑动:
@Override public void computeScroll() { // 调用startScroll的时候scroller.computeScrollOffset()返回true, if (mScroller.computeScrollOffset()) { mContentView.scrollTo(mScroller.getCurrX(), mScroller.getCurrY()); Log.e("=============> ",mScroller.getCurrX()+""); postInvalidate(); if (mScroller.isFinished() && isFinish) { mActivity.finish(); //一定要结束,否则只是contentview看着是退出了,但其实一直没销毁,下面的activity还是获取不到焦点 } } }
computeScroll:主要功能是计算拖动的位移量、更新背景、设置要显示的屏幕(setCurrentScreen(mCurrentScreen);)。 重写computeScroll()的原因调用startScroll()是不会有滚动效果的,只有在computeScroll()获取滚动情况,做出滚动的响应 computeScroll在父控件执行drawChild时,会调用这个方法
原文地址:http://blog.csdn.net/fangchao3652/article/details/43191755