Android 区别普通Touch方法和Scroll

标签: android 普通 touch | 发表时间:2013-01-28 20:56 | 作者:
出处:http://www.iteye.com

    今天想实现这个功能,但只是利用现有的onTouchEvent和GestureDetector感觉做起来有些纠结,原来好像也尝试过,最后搞的程序有点乱,不好维护,那么就利用一下Android程序员最大的优势——源码。

    首先想到的ListView既支持点击又支持拖动,就去看源码,首先找的突破点就是:

    android.view.ViewTreeObserver.OnTouchModeChangeListener

    里面只定义了一个方法;

    public void onTouchModeChanged(boolean isInTouchMode);

    然后就看了一下ViewTreeObserver,发现除了add等并没有相关的内容,然后就找到ListView的父类android.widget.AbsListView,其中实现了该接口。这里面比较复杂就不详细介绍了,结合OnTouchEvent和onTouchModeChanged能看出它的实现机制,但大致看完没有发现很好的解决问题的办法,由于快回去了,又想尽快解决,这时候就想到了手势识别的类android.view.GestureDetector,其实看它的OnTouchEvent要轻松的多,跟前面的实现机制都很像,但相对简单,不过在这不可能找到问题的直接解决办法,但是理解了GestureDetector的事件分发机制和情况,用起来OnGestureListener就会清晰的多。之后就用最基本的实现机制模拟了两个事件的处理,这里说模拟是指的其实并没有真正完全区分,关于这方面觉着较为复杂,还没理清,应该深入看ListView会有具体的实现。好了,直接贴代码吧,上面几个类可以帮助解决这个问题,也可以深入研究,具体的时候并没有用到handler,如果要响应更多的方法的时候这种机制就很有用了,方便扩展。下面直接展示下代码,也比较简单,就不过多解释了,这里理解为滑动20像素才认为是滑动事件来模拟,只是这次看起来比较清晰,就记录一下。

 

        //---------------------------------------------------------------------------
	// 触屏与滑动(仅区分滑动和触屏,如果增加双击等时间需要重新考虑逻辑处理)
	//---------------------------------------------------------------------------
	
	private GestureDetector gestureDetector;        //用手势识别
	
	//表明没有手势事件
	private final int TOUCH_MODE_REST = -1; 
	//表明触摸了屏幕
	private final int TOUCH_MODE_DOWN = 0;
	//表明发生了scroll,但仍需进一步确认是否是滑动事件
	private final int TOUCH_MODE_SCROLLCHECK = 1;   
	//当前为滑动状态
	private final int TOUCH_MODE_SCROLL = 2;
	
	private int touchMode;         //当前touch的状态,利用onDown、OnScroll和ActionUP来区分滑动和触屏
	private int tempOffsetX = 0;   //定义为scroll之前需要先存储偏移

 

        @Override
	public boolean onTouchEvent(MotionEvent event) {
		if(event.getAction()==MotionEvent.ACTION_UP){
			try {
				return handleActionUP(event);
			} catch (InaccurateScrollActionHandleException e) {
				// TODO Auto-generated catch block
				Log.e("DigitBusScreen.onTouchEvent", "Use handleActionUP wrong place");
				return false;
			}
		}
		return gestureDetector.onTouchEvent(event);
	}

 

        @Override
	public boolean onDown(MotionEvent arg0) {
		// TODO Auto-generated method stub
		touchMode = TOUCH_MODE_DOWN;
		return true;
	}
	
	@Override
	public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX,
			float distanceY) {
		// TODO Auto-generated method stub
		switch(touchMode){
		case TOUCH_MODE_DOWN:	
		case TOUCH_MODE_SCROLLCHECK:
			if(Math.abs(tempOffsetX+distanceX)<20){
				tempOffsetX += distanceX;
				touchMode = TOUCH_MODE_SCROLLCHECK;
			}else{
				touchMode = TOUCH_MODE_SCROLL;
				tempOffsetX = 0;
			}
			break;
		case TOUCH_MODE_SCROLL:
			if(distanceX!=0 && (offsetX-distanceX<=0)
			&& (offsetX-distanceX>=-(offsetX+(actualLengthBetweenStation+Positions.getStationXLength())*numberOfStation))){
				for(Sprite sprite:sprites){
					if(sprite instanceof ScrollSprite)
						((ScrollSprite)sprite).scrollChangeOffset(-distanceX, 0);
				}
				offsetX += -distanceX;
			}
			break;
		}
		return true;
	}
	
	/**
	 * 处理ACTION_UP的MotionEvent
	 * @param event
	 * @return
	 * @throws InaccurateScrollActionHandleException
	 */
	private boolean handleActionUP(MotionEvent event) throws InaccurateScrollActionHandleException{
		if(event.getAction()!=MotionEvent.ACTION_UP)
			throw new InaccurateScrollActionHandleException();
		
		switch(touchMode){
		case TOUCH_MODE_SCROLLCHECK:
			tempOffsetX = 0;
		case TOUCH_MODE_DOWN:
			super.onTouchEvent(event);
			break;
		}
		touchMode = TOUCH_MODE_REST;
		return true;
	}

 



已有 0 人发表留言,猛击->> 这里<<-参与讨论


ITeye推荐



相关 [android 普通 touch] 推荐:

Android 区别普通Touch方法和Scroll

- - ITeye博客
    今天想实现这个功能,但只是利用现有的onTouchEvent和GestureDetector感觉做起来有些纠结,原来好像也尝试过,最后搞的程序有点乱,不好维护,那么就利用一下Android程序员最大的优势——源码.     首先想到的ListView既支持点击又支持拖动,就去看源码,首先找的突破点就是:.

Android WebView Touch事件及相关问题处理

- - CSDN博客推荐文章
如有转载,请声明出处: 时之沙:  http://blog.csdn.net/t12x3456. 继上一篇  Android WebView常见问题及解决方案汇总 中归纳了一些处理webview的常见问题,这次要说的是webview中的touch事件:. 有时候在开发中,我们需要对webview加入触摸事件的处理,比如加入滑动效果或者类似于阅读中的翻页效果,这时候我们就需要重写webview中的onTouch方法:.

kindle touch简单说

- - GeoWHY
好吧,最右边的是kindle3,去年买的,后来送丫头,给她在国外看书用了. 最左边的是kindle4,小巴童鞋的,中间那个是我的,kindle touch. touch是99刀,托人从国外带回来,所以很便宜,630块而已,感觉上比kindle3小很多,盈盈可握,倒是蛮适合女孩子用的(领导你拿去用吧,把kindle3换给我就好).

测试touch事件

- - Kejun's Blog
进入触屏时代意味一切要对触屏友好. 今天仅仅测试了ios6,其它版本包括android还不清楚差别有多大. 看了PPK的touch兼容表(http://www.quirksmode.org/mobile/tableTouch.html),深感刚准备告别ie6,又迎来了一个新的混乱时代,苦逼的前端工程师们永远摆脱不了兼容的魔咒.

超给力iPod touch魔术

- bbiy - cnBeta.COM
有魔术师日前在网络上表演了一段令人眼花缭乱的iPod魔术. 他用娴熟的手法把玩三台iPod touch,制造出了炫目的光影效果. 从原理上来看,这种魔术应当只是简单的通过视频播放完成,但时间的准确同步还是有相当的难度,效果也足够给力.

Amazon Kindle Touch 主站動手玩心得

- SotongDJ - Engadget 中文版
做為今天 Amazon 電子書閱讀器三連發的一份子,Kindle Touch 介於中間 -- 有紅外線觸控螢幕,但又不像 Kindle Fire 那樣是用 LCD 螢幕的,大體上是和最新的觸控螢幕 Nook 或 Sony PRS-T1 屬於同類型的產品. 少了實體鍵盤之後,Kindle Touch 比 Kindle 3 小了不少,同時觸控的反應也算是相當不錯,用來輸入文字並沒有什麼大問題.

使用phantom-limb 模拟Touch 事件

- - ITeye博客
下载 phantom-limb.js. 注意phantom-limb位置. // 在这里可以直接监听touch事件了. 测试结果在Canvas上可以正常写字,表示通过. 已有 0 人发表留言,猛击->> 这里<<-参与讨论. —软件人才免语言低担保 赴美带薪读研.

将 iPod Touch 改造为“服务器”

- guoan - Gracecode.com
下面是 周末“闲着蛋疼”科技频道 为您报道. 介于国内目前残酷的网络环境,秉承发挥科学发展观、实现可持续发展的态度,不给国家负担,经过两个小时的艰苦奋斗,终于研发出具有世界领先水平、国际不靠谱产权的无网线、可放在口袋里即可搬离 IDC 的微型服务器. 说正题,周末将我的 iPod 版本升级,破解以后里面没有数据,于是折腾装了个 lighttpd 和 PHP,配合起来就可以跑个小型的 HTTP 服务器了.

Sencha Touch 2 入门 Demo 之一:搭建 Sencha Touch 2 的运行环境

- - 博客园_首页
前段时间不才翻译了关于Sencha Touch 2 MVC架构的一系列文章,大家的认可让我备受鼓舞,也坚定了继续分享自己学习Sencha Touch(下文简称ST)过程和经验的决心. 在跟大家交流的过程中,发现很多入门者反映,学习ST最大的障碍有两个:1、官方文档跟进速度不够;2、官方sample集成程度较高,典型性不足.

Google+ 终于推出支持 iPod touch 和 iPad 的版本,但……

- Jack - 谷奥——探寻谷歌的奥秘
Google+ for iOS最初推出之时最大的问题居然是不支持iPod touch和iPad,这让广大同为谷粉的果粉很是不爽. 今天他们终于更新了Google+ for iOS应用到1.0.2.1966版本,主要更新:. 支持iPod touch和iPad. 但是当你在iPad上打开Google+之后却发现了上图那样的囧况,这……Google这是在搞笑吗.