Android处理触摸事件


Android提供了两种常用的处理触摸事件的方式:

(1)在自定义的View对象中覆盖

public boolean onTouchEvent(MotionEvent event);  

(2)为View指定触摸事件的监听器

myView.setOnTouchListener(new View.onTouchListener(View v, MotionEvent event));

当然一个监听器可以处理多个View的触摸事件,因此多了一个View 参数。下面是一个小小的例子:我们知道一个当点击Button对象时,会调用onClickListener中的onClick函数,我们可以模拟一下这种效果。

  1. import android.app.Activity;  
  2. import android.os.Bundle;  
  3. import android.view.Gravity;  
  4. import android.view.MotionEvent;  
  5. import android.view.View;  
  6. import android.widget.Button;  
  7. import android.widget.Toast;  
  8.   
  9. public class TouchButtonActivity extends Activity {  
  10.   
  11.     Button button1;  
  12.     TouchListener tl;  
  13.       
  14.     @Override  
  15.     public void onCreate(Bundle savedInstanceState) {  
  16.         super.onCreate(savedInstanceState);  
  17.         setContentView(R.layout.main);  
  18.           
  19.         button1 = (Button)findViewById(R.id.button1);  
  20.         tl = new TouchListener();  
  21.           
  22.         button1.setOnTouchListener(tl);  
  23.           
  24.     }  
  25.       
  26.       
  27.     class TouchListener implements View.OnTouchListener{  
  28.           
  29.         private int i = 0;  
  30.         @Override  
  31.         public boolean onTouch(View v, MotionEvent event) {  
  32.             // TODO Auto-generated method stub   
  33.             int action = event.getAction();  
  34.               
  35.             Toast toast = Toast.makeText(getApplicationContext(),   
  36.                     "The "+ event.toString()+"has recieved!", Toast.LENGTH_SHORT);  
  37.             toast.setGravity(Gravity.CENTER , 0100*i);  
  38.             i++;  
  39.             i = i%4;  
  40.             toast.show();  
  41.               
  42.             return false;  
  43.         }  
  44.     }  
  45. }  

运行上面的代码,点击Button按钮会出现几个Toast提示框。实际上当我们点击View时,收到的是一个 事件序列。刚点击时会收到ACTION_DOWN, 触摸屏是很敏感的, 你还会收到几个ACTION_MOVE, 当手放开时会收到ACTION_UP;下面来点有意思的代码来处理不同的事件。其中手势终止时会会触发ACTION_CANCEL。

  1. import android.content.Context;  
  2. import android.graphics.Canvas;  
  3. import android.graphics.Color;  
  4. import android.graphics.Paint;  
  5. import android.util.AttributeSet;  
  6. import android.view.MotionEvent;  
  7. import android.view.View;  
  8.   
  9. public class Dot extends View {  
  10.       
  11.     private static final float RADIUS = 40;  
  12.     private float x = 40;  
  13.     private float y = 40;  
  14.     private float initialX;  
  15.     private float initialY;  
  16.     private float offsetX;  
  17.     private float offsetY;  
  18.     private Paint backgroundPaint;  
  19.     private Paint myPaint;  
  20.   
  21.     public Dot(Context context, AttributeSet attrs) {  
  22.         super(context, attrs);  
  23.           
  24.         backgroundPaint = new Paint();  
  25.         backgroundPaint.setColor(Color.BLUE);  
  26.           
  27.         myPaint = new Paint();  
  28.         myPaint.setColor(Color.YELLOW);  
  29.         myPaint.setAntiAlias(true);  
  30.           
  31.     }  
  32.       
  33.     @Override  
  34.     public boolean onTouchEvent(MotionEvent event){  
  35.         int action = event.getAction();  
  36.         switch(action){  
  37.         case MotionEvent.ACTION_DOWN:  
  38.             initialX = x;  
  39.             initialY = y;  
  40.             offsetX = event.getX();  
  41.             offsetY = event.getY();  
  42.             break;  
  43.         case MotionEvent.ACTION_MOVE:  
  44.         case MotionEvent.ACTION_UP:  
  45.         case MotionEvent.ACTION_CANCEL:  
  46.             x = initialX + event.getX() - offsetX;  
  47.             y = initialY + event.getY() - offsetY;  
  48.             break;  
  49.         }  
  50.         event.recycle();  
  51.         return(true);  
  52.     }  
  53.      @Override  
  54.      public void draw(Canvas canvas){  
  55.          int width = canvas.getWidth();  
  56.          int height = canvas.getHeight();  
  57.            
  58.          canvas.drawRect(00, width, height, backgroundPaint);  
  59.          canvas.drawCircle(x, y, RADIUS, myPaint);  
  60.          invalidate();  
  61.      }  
  62. }  

下面是mian.xml

  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"  
  3.     android:orientation="vertical"  
  4.     android:layout_width="fill_parent"  
  5.     android:layout_height="fill_parent"  
  6.     >  
  7. <com.tsiannian.gmail.dot.Dot  
  8.     android:id="@+id/dot"  
  9.     android:layout_width="wrap_content"  
  10.     android:layout_height="wrap_content"  
  11.     />  
  12. </LinearLayout>  
  • 1
  • 2
  • 下一页

相关内容