2013-07-31 118 views
0

我使用GestureDetector.OnGestureListener來實現Android中的捏合縮放。我正在擴展TextView類,因此方法setTextSize()已經實施。以下是我的代碼onScroll()爲什麼Android MotionEvent.getHistoricalX發生異常

@Override 
public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) { 
    if(LOGGING) Log.v(MODULE_NAME, "onScroll()"); 

    float x, y; 
    float oldDist, newDist; 

    if (e2.getPointerCount() == 2 && 
     ((e2.getAction() & MotionEvent.ACTION_MASK) == MotionEvent.ACTION_MOVE)) { 
     x = e2.getHistoricalX(0, 0) - e2.getHistoricalX(1, 0); 
     y = e2.getHistoricalY(0, 0) - e2.getHistoricalY(1, 0); 
     oldDist = FloatMath.sqrt(x * x + y * y); 
     if (oldDist > 10) { 
      if (LOGGING) Log.d(MODULE_NAME, "Starting ZOOM mode");      
      x = e2.getX(0) - e2.getX(1); 
      y = e2.getY(0) - e2.getY(1); 
      newDist = FloatMath.sqrt(x * x + y * y); 

      if (newDist > 30) { 
        float scaleFactor = (newDist > oldDist) ? oldDist : newDist; 
        float scale = (newDist - oldDist)/scaleFactor; 
        // Callback to be processed in main thread 
        setTextSize(scale * currentTextSize); 
        oldDist = newDist; 
      }  
      scrollDetected = true; 
      return true; 
     } 
    } 
    return false;    
} 

我的問題是偶然,並不總是getHistoricalX()拋出異常。我附加了LogCat結果。

07-31 16:53:30.358: V/ZoomTextView(19540): onScroll() 
07-31 16:53:30.358: E/InputEventReceiver(19540): Exception dispatching input event. 
07-31 16:53:30.358: E/MessageQueue-JNI(19540): Exception in MessageQueue callback: handleReceiveCallback 
07-31 16:53:30.358: E/MessageQueue-JNI(19540): java.lang.IllegalArgumentException: historyPos out of range 
07-31 16:53:30.358: E/MessageQueue-JNI(19540): at android.view.MotionEvent.nativeGetAxisValue(Native Method) 
07-31 16:53:30.358: E/MessageQueue-JNI(19540): at android.view.MotionEvent.getHistoricalX(MotionEvent.java:2739) 

因爲我知道,有2個三分球,而且歷史至少是0的大小,這是我不清楚如何或爲何這發生異常。任何人都可以請協助?

我看到this similar question,這對我沒有任何幫助。

+1

你怎麼知道有一個歷史?你根本不檢查'getHistorySize()'。如果它的大小爲0,那麼索引0無效(這將是大小1)。 – Geobits

+0

我認爲如果沒有歷史記錄,索引0將是當前的一個 – levengli

+0

不,這只是'getX',而不是'getHistoricalX' – Geobits

回答

7

在使用getHistoricalX()getHistoricalY()之前,您應該檢查尺寸getHistorySize()

如果它返回零,就知道沒有歷史事件。然後,您只需使用getX()getY()即可處理當前事件。

1

你有同樣的問題,並得到解決感謝Geobits的答案。只是檢查getHistorySize()是不是返回0:

  if (event.getHistorySize() > 0) { 

       float lastX = event.getHistoricalX(0); 

      } 
相關問題