码迷,mamicode.com
首页 > 其他好文 > 详细

屏幕滑动 Scroll

时间:2015-01-27 11:10:49      阅读:226      评论:0      收藏:0      [点我收藏+]

标签:android scroll

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

屏幕滑动 Scroll

标签:android scroll

原文地址:http://blog.csdn.net/fangchao3652/article/details/43191755

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!