2013-07-31 71 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); 

      } 
相关问题