zoukankan      html  css  js  c++  java
  • 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像素才认为是滑动事件来模拟,只是这次看起来比较清晰,就记录一下。
     
    Java代码  
           //---------------------------------------------------------------------------  
    // 触屏与滑动(仅区分滑动和触屏,如果增加双击等时间需要重新考虑逻辑处理)  
    //---------------------------------------------------------------------------  
      
    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之前需要先存储偏移  
     
    Java代码:  
    1.        @Override  
    2. public boolean onTouchEvent(MotionEvent event) {  
    3.     if(event.getAction()==MotionEvent.ACTION_UP){  
    4.         try {  
    5.             return handleActionUP(event);  
    6.         } catch (InaccurateScrollActionHandleException e) {  
    7.             // TODO Auto-generated catch block  
    8.             Log.e("DigitBusScreen.onTouchEvent", "Use handleActionUP wrong place");  
    9.             return false;  
    10.         }  
    11.     }  
    12.     return gestureDetector.onTouchEvent(event);  
    13. }  
     
    Java代码:  
    1.        @Override  
    2. public boolean onDown(MotionEvent arg0) {  
    3.     // TODO Auto-generated method stub  
    4.     touchMode = TOUCH_MODE_DOWN;  
    5.     return true;  
    6. }  
    7.   
    8. @Override  
    9. public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX,  
    10.         float distanceY) {  
    11.     // TODO Auto-generated method stub  
    12.     switch(touchMode){  
    13.     case TOUCH_MODE_DOWN:     
    14.     case TOUCH_MODE_SCROLLCHECK:  
    15.         if(Math.abs(tempOffsetX+distanceX)<20){  
    16.             tempOffsetX += distanceX;  
    17.             touchMode = TOUCH_MODE_SCROLLCHECK;  
    18.         }else{  
    19.             touchMode = TOUCH_MODE_SCROLL;  
    20.             tempOffsetX = 0;  
    21.         }  
    22.         break;  
    23.     case TOUCH_MODE_SCROLL:  
    24.         if(distanceX!=0 && (offsetX-distanceX<=0)  
    25.         && (offsetX-distanceX>=-(offsetX+(actualLengthBetweenStation+Positions.getStationXLength())*numberOfStation))){  
    26.             for(Sprite sprite:sprites){  
    27.                 if(sprite instanceof ScrollSprite)  
    28.                     ((ScrollSprite)sprite).scrollChangeOffset(-distanceX, 0);  
    29.             }  
    30.             offsetX += -distanceX;  
    31.         }  
    32.         break;  
    33.     }  
    34.     return true;  
    35. }  
    36.   
    37. /** 
    38.  * 处理ACTION_UP的MotionEvent 
    39.  * @param event 
    40.  * @return 
    41.  * @throws InaccurateScrollActionHandleException 
    42.  */  
    43. private boolean handleActionUP(MotionEvent event) throws InaccurateScrollActionHandleException{  
    44.     if(event.getAction()!=MotionEvent.ACTION_UP)  
    45.         throw new InaccurateScrollActionHandleException();  
    46.       
    47.     switch(touchMode){  
    48.     case TOUCH_MODE_SCROLLCHECK:  
    49.         tempOffsetX = 0;  
    50.     case TOUCH_MODE_DOWN:  
    51.         super.onTouchEvent(event);  
    52.         break;  
    53.     }  
    54.     touchMode = TOUCH_MODE_REST;  
    55.     return true;  
    56. }  
  • 相关阅读:
    理解javascript 对象,原型对象、闭包
    JSON数据理解
    css 盒模型相关样式
    神奇的CSS3选择器
    设计模式六大原则
    java反射机制性能优化
    一份关于jvm内存调优及原理的学习笔记
    浅谈http请求数据分析
    Apache+Tomcat部署负载均衡(或集群)
    同台电脑部署多组Tomcat负载均衡(或集群)
  • 原文地址:https://www.cnblogs.com/awkflf11/p/4613098.html
Copyright © 2011-2022 走看看