onTouchEvent和onInterceptTouchEvent()

event.getAction() //获取触控动作比如ACTION_DOWN

  event.getPointerCount(); //获取触控点的数量,比如2则可能是两个手指同时按压屏幕

  event.getPointerId(nID); //对于每个触控的点的细节,我们可以通过一个循环执行getPointerId方法获取索引

  event.getX(nID); //获取第nID个触控点的x位置

  event.getY(nID); //获取第nID个点触控的y位置

  event.getPressure(nID); //LCD可以感应出用户的手指压力,当然具体的级别由驱动和物理硬件决定的

  event.getDownTime() //按下开始时间

  event.getEventTime() // 事件结束时间

  event.getEventTime()-event.getDownTime()); //总共按下时花费时间



onInterceptTouchEvent()方法

 1.down事件首先会传递到onInterceptTouchEvent()方法
         * 2.如果该ViewGroup的onInterceptTouchEvent()在接收到down事件处理完成之后return false,那么后续的move, up等事件将继续会先传递给该ViewGroup,之后才和down事件一样传递给最终的目标view的onTouchEvent()处理。
         * 3.如果该ViewGroup的onInterceptTouchEvent()在接收到down事件处理完成之后return true,那么后续的move, up等事件将不再传递给onInterceptTouchEvent(),而是和down事件一样传递给该ViewGroup的onTouchEvent()处理,注意,目标view将接收不到任何事件。
         * 4.如果最终需要处理事件的view的onTouchEvent()返回了false,那么该事件将被传递至其上一层次的view的onTouchEvent()处理。
         * 5.如果最终需要处理事件的view 的onTouchEvent()返回了true,那么后续事件将可以继续传递给该view的onTouchEvent()处理。
        

onTouchEvent。该方法在View类中的定义,并且所有的View子类全部重写了该方法,应用程序可以通过该方法处理手机屏幕的触摸事件。该方法的签名如下所示。

  
  
  
  
  1. public boolean onTouchEvent (MotionEvent event) 

参数event:参数event为手机屏幕触摸事件封装类的对象,其中封装了该事件的所有信息,例如触摸的位置、触摸的类型以及触摸的时间等。该对象会在用户触摸手机屏幕时被创建。

返回值:该方法的返回值机理与键盘响应事件的相同,同样是当已经完整地处理了该事件且不希望其他回调方法再次处理时返回true,否则返回false。

该方法并不像之前介绍过的方法只处理一种事件,一般情况下以下三种情况的事件全部由onTouchEvent方法处理,只是三种情况中的动作值不同。

屏幕被按下:当屏幕被按下时,会自动调用该方法来处理事件,此时MotionEvent.getAction()的值为MotionEvent.ACTION_DOWN,如果在应用程序中需要处理屏幕被按下的事件,只需重新该回调方法,然后在方法中进行动作的判断即可。

屏幕被抬起:当触控笔离开屏幕时触发的事件,该事件同样需要onTouchEvent方法来捕捉,然后在方法中进行动作判断。当MotionEvent.getAction()的值为MotionEvent.ACTION_UP时,表示是屏幕被抬起的事件。

在屏幕中拖动:该方法还负责处理触控笔在屏幕上滑动的事件,同样是调用MotionEvent.getAction()方法来判断动作值是否为MotionEvent.ACTION_MOVE再进行处理。

接下来通过一个简单的案例介绍该方法的使用方法。在该案例中,会在用户点击的位置绘制一个矩形,然后监测用户触控笔的状态,当用户在屏幕上移动触控笔时,使矩形随之移动,而当用户触控笔离开手机屏幕时,停止绘制矩形。该案例的开发步骤如下。

创建一个名为Sample_7_2的Android项目。

打开Sample_7_2.java文件,输入如下所示的代码。

  
  
  
  
  1. 1   package wyf.ytl;                            
    //声明所在包  
  2. 2   import android.app.Activity;           
    //引入Activity类  
  3. 3   import android.content.Context;          
    //引入Context类  
  4. 4   import android.graphics.Canvas;          
    //引入Canvas类  
  5. 5   import android.graphics.Color;          
    //引入Color类  
  6. 6   import android.graphics.Paint;          
    //引入Paint类  
  7. 7   import android.os.Bundle;                  
    //引入Bundle类  
  8. 8   import android.view.MotionEvent;            
    //引入MotionEvent类  
  9. 9   import android.view.View;                   
    //引入View类  
  10. 10  public class Sample_7_2 extends Activity {  
  11. 11      MyView myView;                         
    //自定义View的引用  
  12. 12          public void onCreate(Bundle 
    savedInstanceState) { //重写的onCreate方法  
  13. 13              super.onCreate(savedInstanceState);  
  14. 14              myView = new MyView(this);          
    //初始化自定义的View  
  15. 15              setContentView(myView);             
    //设置当前显示的用户界面  
  16. 16          }  
  17. 17      @Override  
  18. 18      public boolean onTouchEvent(MotionEvent event)
    {    //重写的onTouchEvent回调方法  
  19. 19          switch(event.getAction()){  
  20. 20          case MotionEvent.ACTION_DOWN:           
    //按下  
  21. 21              myView.x = (int) event.getX();      
    //改变x坐标  
  22. 22              myView.y = (int) event.getY()-52;  
    //改变y坐标  
  23. 23              myView.postInvalidate();           
    //重绘  
  24. 24              break;  
  25. 25          case MotionEvent.ACTION_MOVE:           
    //移动  
  26. 26              myView.x = (int) event.getX();     
    //改变x坐标  
  27. 27              myView.y = (int) event.getY()-52;  
    //改变y坐标  
  28. 28              myView.postInvalidate();           
    //重绘  
  29. 29              break;  
  30. 30          case MotionEvent.ACTION_UP:          
    //抬起  
  31. 31              myView.x = -100;                  
    //改变x坐标  
  32. 32              myView.y = -100;                  
    //改变y坐标  
  33. 33              myView.postInvalidate();         
    //重绘  
  34. 34              break;  
  35. 35          }  
  36. 36          return super.onTouchEvent(event);  
  37. 37      }  
  38. 38      class MyView extends View{                
    //自定义的View  
  39. 39              Paint paint;                      
    //画笔  
  40. 40              int x = 50;                       
    //x坐标  
  41. 41              int y = 50;                       
    //y坐标  
  42. 42              int w = 50;                       
    //矩形的宽度  
  43. 43          public MyView(Context context) {      
    //构造器  
  44. 44              super(context);  
  45. 45              paint = new Paint();                
    //初始化画笔  
  46. 46          }  
  47. 47          @Override  
  48. 48          protected void onDraw(Canvas canvas) { 
    //绘制方法  
  49. 49              canvas.drawColor(Color.GRAY);        
    //绘制背景色  
  50. 50              canvas.drawRect(x, y, x+w, y+w, paint);   
    //绘制矩形  
  51. 51              super.onDraw(canvas);  
  52. 52          }  
  53. 53      }  
  54. 54  } 

代码位置:见随书光盘中源代码/第7章/ Sample_7_2/src/wyf/ytl目录下的Sample_7_2.java。

第11行声明自定义View的引用,第12~16行重写Activity的onCreate方法,该方法会在此Activity创建时被系统调用,在方法中先初始化自定义的View,然后将当前的用户界面设置成该View。

第18~37行为重写的屏幕监听方法,在该方法中,根据事件动作的不同执行不同的操作。

第20~24行表示当前事件为屏幕被按下的事件,通过调用MotionEvent的getX()和getY()方法得到事件发生的坐标,然后设置给自定义View的x与y成员变量。

第25~29行表示在屏幕上滑动时的事件,同样是得到事件发生的位置并设置给View的x、y。需要注意的是,因为此时手机屏幕并不是全屏模式,所以需要对坐标进行调整。

第30~34行处理的是屏幕被抬起的事件,此时将View的x、y成员变量设成-100。表示并不需要在屏幕中绘制矩形。

第38~53行为自定义的View类,并重写了绘制方法onDraw。在第43~45行的构造器中初始化绘制时需要的画笔,然后在第48~52行的方法中根据成员变量x、y的值绘制绘制矩形。

提示:自定义的View并不会自动刷新,所以每次改变数据模型时都需要调用postInvalidate方法进行屏幕的刷新操作。关于自定义View的使用方法,将会在后面的章节中进行详细介绍,此处只是简单地使用。

运行该案例,将看到如图7-3所示的效果。

点击屏幕时,会在点击的位置绘制一个矩形,当触控笔在屏幕中滑动时,该矩形会随之移动,而当触控笔离开屏幕时,便会取消绘制矩形。




你可能感兴趣的:(android,UP,action,手机)