屏幕滑动 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时,会调用这个方法

时间: 2024-10-23 23:39:45

屏幕滑动 Scroll的相关文章

Android4.4-Launcher源码分析系列之WorkSpace及屏幕滑动

一.WorkSpace是什么 前面已经介绍了一个WorkSpace包含了多个CellLayout,再回忆下之前画过的图 WorkSpace是一个ViewGroup,它的布局如下 <com.android.launcher3.Workspace android:id="@+id/workspace" android:layout_width="match_parent" android:layout_height="match_parent"

iOS中tableview中headerview总保持在屏幕上方和随着屏幕滑动一起移动至消失

1 : tableview中headerview总保持在屏幕上方 :  在代理方法中创建view,并添加到headerview上 l例子: - (UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section { if ([self.title isEqualToString:@"幕后"]) { NSArray *array = @[@"全部",@"

禁止遮罩层以下屏幕滑动

相信大家在做移动端开发的时候会经常遇到这种场景,需要适时的弹出遮罩(有时为了突出还会在外面加上蒙层),弹窗出现以后,为了追求良好的用户体验,遮罩以下的屏幕是禁止滑动的.在网上找了很多资料,大体就这两种做法,但都有不完善的地方.加上自己的思考和总结,想到一个办法,应该可以解决你的问题. a)大众型 一般,大家想到的都是给body或者html添加overflow:hidden样式,当然height要设置成100%.这样在大多数机型上是可以的,但有个别的就是不起作用,我也不知道为什么(求知道的大神告知

结合css与javascript来实现手机移动端的屏幕滑动效果

今天心情不错  那就写写博客吧   今天我在这里与大家分享一下手机移动端的屏幕切换的效果希望能帮助一些刚接触js的同学 好啦 不多说,上代码 我们先上设置一个父容器div  然后里面包含了子容器 然后给它们加上 class 我这里定义好了它们的布局 接下来我们来设置它的样式 好 这里是先给父容器定义了样式  然后在给子容器定义样式 到了这里呢 基本的布局已经写好了 然后根据你的个人喜好来给每个手机屏幕切换的背景颜色 还是在style里去添加样式 背景颜色也写完了 这是我随便弄了几个颜色 接下来我

禁止遮罩层以下屏幕滑动----正解

相信大家在做移动端开发的时候会经常遇到这种场景,需要适时的弹出遮罩(有时为了突出还会在外面加上蒙层),弹窗出现以后,为了追求良好的用户体验,遮罩以下的屏幕是禁止滑动的.在网上找了很多资料,大体就这两种做法,但都有不完善的地方.加上自己的思考和总结,想到一个办法,应该可以解决你的问题. a)大众型 一般,大家想到的都是给body或者html添加overflow:hidden样式,当然height要设置成100%.这样在大多数机型上是可以的,但有个别的就是不起作用,我也不知道为什么(求知道的大神告知

安卓标题栏随屏幕滑动改变颜色

为了我们项目的美观我们也许经常会碰到一些感觉很头疼的问题,如标题所说就是一个,一个scrollView包裹的页面或者存在listView的页面往往需要在往上滑动的时候标题栏实现悬浮并且背景颜色也要随之改变.废话不多说了,直接说怎么实现吧. 1.如果是scrollView包裹的页面,我们需要把scrollView和标题栏定义在相对布局中,保证标题栏可以悬浮,listView也是同理. 2.如果是scrollView我们需要用到onOverScrolled方法,然而这是一个protected方法,所

appium-封装屏幕滑动方法

from common.logger import Logger logger=Logger().get_logger() class BasePage: def __init__(self,driver): self.driver=driver def get_window_size(self): logger.info("正在准备获取当前屏幕的大小") try: size=self.driver.get_window_size() width=size["width&qu

Android 屏幕滑动事件

http://blog.csdn.net/iamfafa/article/details/6316062 Android里有两个类 android.view.GestureDetector android.view.GestureDetector.SimpleOnGestureListener (另外android.widget.Gallery好像是更牛x的OnGestureListener ) 1)新建一个类继承SimpleOnGestureListener,HahaGestureDetect

移动端禁止遮罩层以下屏幕滑动

var ruleTxt = $(".wanfan .rule .rule-txt");var ruleTxtBottom = $(".wanfan .rule .rule-txt .rule-txt-bottom");var flag = '';$(".wanfan .rule .rule-btn").on('click',function(){ var h=window.screen.height; ruleTxt.css({'width':'