觸碰偵測


本篇我們來看看在 Android 上的觸碰偵測,觸碰偵測的方法主要是由 onTouchEvent( Motion event) 來觸發,只要你使用的類別有這個方法,就能很簡單的使用,以上篇的 HelloWorld 為例,加以修改

MainActivity.java

   1:  package com.example.helloworld;
   2:   
   3:  import android.app.Activity;
   4:  import android.content.Context;
   5:  import android.graphics.Color;
   6:  import android.graphics.Typeface;
   7:  import android.os.Bundle;
   8:  import android.util.Log;
   9:  import android.view.Gravity;
  10:  import android.view.MotionEvent;
  11:  import android.widget.TextView;
  12:   
  13:  public class MainActivity extends Activity {
  14:      
  15:      static final String tLog = "Trace Log";
  16:      
  17:      TestTextView ttv;
  18:      
  19:      int dx;// get touch down x position
  20:      int dy;// get touch down y position
  21:      int mx;// get touch move x position
  22:      int my;// get touch move y position 
  23:      
  24:      @Override
  25:      public void onCreate(Bundle savedInstanceState) {
  26:          
  27:          super.onCreate(savedInstanceState);
  28:  //        setContentView(R.layout.activity_main);
  29:          
  30:          ttv = new TestTextView(this);
  31:          
  32:          ttv.setTextColor(0xff888888); // set color
  33:          ttv.setTextSize(18.0f); // set size
  34:          ttv.setTypeface(Typeface.SERIF);// set typeface 
  35:          ttv.setText(R.string.copy_right);// change text
  36:          ttv.setGravity(Gravity.CENTER_HORIZONTAL | Gravity.CENTER_VERTICAL);
  37:          setContentView(ttv);
  38:   
  39:          
  40:      }
  41:      
  42:      public boolean onTouchEvent(MotionEvent event){
  43:          
  44:          int touchCount = event.getPointerCount(); // get touchcount
  45:          Log.v(MainActivity.tLog, ""+touchCount);
  46:          
  47:          switch(event.getAction()){
  48:          
  49:              case MotionEvent.ACTION_DOWN://touch down
  50:                  ttv.setTextColor(Color.RED);
  51:                  dx = (int) event.getX();// get x position
  52:                  dy = (int) event.getY();// get y position
  53:                  break;
  54:              case MotionEvent.ACTION_UP://touch leave
  55:                  ttv.setTextColor(0xff888888);
  56:                  break;
  57:              case MotionEvent.ACTION_MOVE://touch move
  58:                  
  59:                  mx = (int) event.getX();// get x position
  60:                  my = (int) event.getY();// get y position
  61:                  
  62:                  if(Math.abs(dx-mx)>20 || Math.abs(dy-my)>20)
  63:                  {
  64:                      ttv.setTextColor(Color.GREEN);
  65:                  }
  66:                  
  67:                  break;
  68:          }
  69:          
  70:          return true;
  71:      }
  72:    
  73:  }
  74:   
  75:   
  76:  class TestTextView extends TextView{
  77:   
  78:      public TestTextView(Context context) {
  79:          super(context);
  80:          // TODO Auto-generated constructor stub
  81:      }
  82:      
  83:  }


第 17 行把 ttv 做為 MainActivity 的物件,這樣可以讓我在 onTouchEvent() 方便改變顏色
第 19 ~ 22 行用來儲存按下以及移動的座標,這是為了讓移動不這麼靈敏
第 42 ~ 71 行就是偵測觸碰點的方法
第 44 行取得觸碰的總數,不過後面沒用到
第 47 行取得觸碰點的行為,行為種類相當多,後面只示範比較基本的方法(按下移動離開),詳細請參考這裡
第 49 行為按下的行為,我把 ttv 改為紅色(第 50 行)
第 51 ~ 52 行取得按下時的座標
第 54 行為離開的行為, ttv 恢復顏色
第 57 行為移動的行為
第 59 ~ 60 行取得移動時的座標,
第 62 ~ 65 行當移動時的座標變動不太大時才改變顏色, 事實上你也可以直接使用第 64 行,它非常靈敏

結果為
正常狀態                              

















按下狀態

















移動狀態
























0 意見:

張貼留言

Twitter Delicious Facebook Digg Stumbleupon Favorites More

 
Design by Free WordPress Themes | Bloggerized by Lasantha - Premium Blogger Themes | Affiliate Network Reviews