2010-06-30 40 views
1

我一直在試圖編寫一個識別Android自定義事件的小應用程序:您將手指放在TextView上一段時間,並且它會改變顏色。我使用MotionEvent座標並檢查它們是否位於表格內特定TextView的範圍內。Android中事件座標和視圖座標不匹配?

private boolean checkBounds(TextView v, MotionEvent event) { 

     int[] origin = new int[2]; 
     v.getLocationOnScreen(origin); 

     if ((event.getX() > origin[0]) && (event.getX() < (origin[0] + v.getMeasuredWidth()))) { 
      if ((event.getY() > origin[1]) && (event.getY() < (origin[1] + v.getMeasuredHeight()))) { 
       return true; 
      } 
     } 
     return false; 
    } 

我只是將onTouch監聽器附加到活動中的表上。但我得到奇怪的錯誤:座標似乎被一個視圖關閉(即如果我觸摸視圖下面的視圖反應);或者有時候會有反應,而另一個則不會。任何想法可能會發生什麼?

回答

3

我通常是因爲通知欄的大小....嘗試這樣做:

private boolean checkBounds(TextView v, MotionEvent event) { 
    // here you will have to get a reference of the global view (the View that holds the UI) 
    View globalView = ...; // the main view of my activity/application 
    DisplayMetrics dm = new DisplayMetrics(); 
    this.getWindowManager().getDefaultDisplay().getMetrics(dm); 
    int topOffset = dm.heightPixels - globalView.getMeasuredHeight(); 

     int[] origin = new int[2]; 
     v.getLocationOnScreen(origin); 

    final int x = origin[0]; 
    final int y = origin[1] - topOffset; 


     if ((event.getX() > x) && (event.getX() < (x + v.getMeasuredWidth()))) { 
      if ((event.getY() > y) && (event.getY() < (y + v.getMeasuredHeight()))) { 
       return true; 
      } 
     } 
    return false; 
} 

反正...我敢肯定有實現你想要什麼更好的方法。據我所知,TextView s能夠發送OnClik事件。

+0

謝謝,這個作品非常漂亮!順便說一句,我正在使用我自己的事件框架,因爲點擊不是標準點擊(這是一秒鐘握住以滑動結束)。 謝謝, 尼克。 – 2010-06-30 19:34:02

1

使用getRawX()getRawY()似乎工作。