现在我们来实现一个这样的效果: 屏幕向右滑动超过二分之一屏幕宽度时,松手时,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时,会调用这个方法