`
384444165
  • 浏览: 258762 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Android 区别普通Touch方法和Scroll

阅读更多

    今天想实现这个功能,但只是利用现有的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
0
分享到:
评论

相关推荐

    onclick与ontouch和scroll监听冲突的解决方法

    在Android开发中,我们经常会遇到各种事件监听器的冲突问题,特别是`onclick`、`ontouch`和`scroll`监听器。这些事件在用户交互时可能会同时触发,导致不期望的行为,例如,当用户尝试滚动页面时,点击事件却意外...

    Android-recycler-fast-scroll为recyclerview提供了快速滚动和选择索引器

    为了解决这个问题,"Android-recycler-fast-scroll"项目提供了一个解决方案,即为RecyclerView添加快速滚动和选择索引器功能。 快速滚动(Fast Scroll)允许用户通过滑动右侧的小滚动条来迅速浏览列表,而无需逐个...

    addeventlistener监听scroll跟touch(实例讲解)

    本文将深入探讨如何使用`addEventListener`来监听`scroll`和`touch`事件,并理解其中涉及的技术细节。 首先,我们要了解在手机上特有的`touch`事件。`touch`事件系列主要包括三个主要事件: 1. `touchstart`:当...

    Android代码-android-auto-scroll-view-pager

    Android Auto Scroll ViewPager ViewPager which can auto scrolling, cycling, decelerating. ViewPager which can be slided normal in parent ViewPager. 中文介绍见: Android自动滚动 轮播循环的ViewPager ...

    Android代码-auto-scroll-capture

    &gt; 很久之前写过一篇完全不同于其他长截屏方案的的博客,不过很仓促,现在重新整理一下 android长截屏beta1 miui自动滚动长截屏效果 画 给滚动控件外面嵌套一个FrameLayout(LinearLayout等也可以) 手动调用...

    android scroll

    `dispatchNestedPreScroll()`和`dispatchNestedScroll()`方法用于分发滚动事件,而`onNestedPreScroll()`和`onNestedScroll()`则用于接收并处理这些事件。 7. **优化滚动性能**: 为了保证流畅的滚动体验,避免在...

    Android代码-bubble-scroll

    bubble-scroll For a fun read, see my Companion Article on Medium.com Inspired by the very awesome Dribble by Nikita Duhovny

    Android Scroll分析(二)——实现滑动的五种方法

    实现滑动的思想基本是一致的,当触摸View时,系统记下当前触摸点坐标;当手指移动时,系统记下移动后的触摸点坐标,从而获取到相对于前一次坐标点的偏移量,并通过偏移量来修改View的坐标,这样不断重复,从而实现...

    Android代码-recycler-fast-scroll

    Widget for RecyclerView fast scrolling, like Android's built-in fast scroll option for ListView. Supports any vertically scrolling LayoutManager, as well as proper integration for AppBarLayout. ...

    微信小程序scroll-x失效的完美解决方法

    失效的scroll-x 在微信小程序的文档中,使用scroll-view标签,然后给它设置一个scroll-x就可以实现元素,横向排列,可以左右滑动。。。。  然而,在实际开发中,发现并不是这么简单。。。贴上部分wxml和wxss代码… ...

    Android继承ViewGroup实现Scroll滑动效果的方法示例

    本文实例讲述了Android继承ViewGroup实现Scroll滑动效果的方法。分享给大家供大家参考,具体如下: extends ViewGroup需要重写onMeasure和onLayout方法 onMeasure方法是去测量ViewGroup需要的大小以及包含的子View...

    Element InfiniteScroll无限滚动的具体使用方法

    基础用法是实现无限滚动的核心,需要在Vue组件的模板中添加`v-infinite-scroll`指令和一个方法。当滚动到列表的底部时,该方法会被自动调用。在示例代码中,一个无序列表`&lt;ul&gt;`和一个循环`v-for`被用来生成内容列表...

    android-auto-scroll-view-pager自动循环滚动

    `android-auto-scroll-view-pager`则在ViewPager的基础上增加了自动播放和循环滚动的功能。这个库的核心功能包括: 1. **自动播放**:设置定时器,每隔一定时间自动切换到下一个页面,模拟轮播效果。 2. **循环滚动...

    js中scrollTop()方法和scroll()方法用法示例.docx

    ### JavaScript中的`scrollTop()`方法和`scroll()`方法详解 #### 一、`scrollTop()`方法概述 `scrollTop()`方法是JavaScript中用于操作元素滚动位置的一种常用方法。它属于`Element`对象的一部分,通常用于获取或...

    Android View scroll 翻页示例代码

    以上就是关于`Android View scroll`的一些关键知识点。在实际开发中,理解这些原理和技巧,可以更好地实现和优化Android应用中的滚动效果。通过`MyScrollView`的源代码学习,可以深入理解滚动视图的工作机制,提升...

    Android Scroll分析

    首先,Android中的滚动分为两种基本类型:垂直滚动(Vertical Scroll)和水平滚动(Horizontal Scroll)。通常,ListView、RecyclerView等列表视图支持垂直滚动,而GridView或HorizontalScrollView则支持水平滚动。...

    Android CustomList Scroll Refresh.rar

    Android CustomList Scroll Refresh

    delphi ScrollBox支持滚轮

    9. **多平台支持**:由于Delphi支持跨平台开发,ScrollBox在Windows、macOS、iOS和Android等平台上都能提供一致的滚动体验。 10. **自绘滚动条**:对于有特殊设计需求的应用,开发者还可以选择自定义滚动条的外观,...

    react-native-nested-scroll-view,Android NestedScrollView的React本机包装.zip

    然后在你的组件中,你可以像使用普通的`ScrollView`一样使用`NestedScrollView`,并根据需要配置属性和事件。 例如: ```jsx import NestedScrollView from 'react-native-nested-scroll-view'; class MyComponent...

    uniapp scroll-view 横向和纵向滚动 带滚动回调

    7. **其他属性和事件**:除了上述特性外,`scroll-view`还提供了许多其他属性和事件,如`scroll-top`、`scroll-left`用于设置滚动位置,`scroll-into-view`用于滚动到指定子元素,`@scrollEnd`事件在滚动停止时触发...

Global site tag (gtag.js) - Google Analytics