【问题标题】:why is Android MotionEvent.getHistoricalX is thowing an exception为什么 Android MotionEvent.getHistoricalX 抛出异常
【发布时间】:2013-07-31 14:09:02
【问题描述】:

我正在使用GestureDetector.OnGestureListener 在 Android 中实现捏合缩放。我正在扩展一个TextView 类,因此方法setTextSize() 已经实现。以下是我的onScroll() 代码。

 @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,对我没有帮助。

【问题讨论】:

  • 你怎么知道有历史?你根本没有检查getHistorySize()。如果它的大小为 0,则索引 0 无效(即大小为 1)。
  • 我以为如果没有历史,索引0就是当前的
  • 不,那只是getX,不是getHistoricalX
  • 如果您这样发布,我很乐意接受您的回答。它解决了我的问题

标签: android exception motionevent


【解决方案1】:

在使用getHistoricalX()getHistoricalY() 之前,您应该使用getHistorySize() 检查大小。

如果它返回零,您就知道没有历史事件。然后你只需要处理当前事件,使用getX()getY()

【讨论】:

    【解决方案2】:

    您好,有同样的问题,感谢 Geobits 的回答,问题已解决。只需检查 getHistorySize() 是否返回 0:

                if (event.getHistorySize() > 0) {
    
                    float lastX = event.getHistoricalX(0);
    
                }
    

    【讨论】:

      猜你喜欢
      • 2010-12-09
      • 2011-01-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-04-28
      • 2011-12-12
      • 1970-01-01
      • 2013-09-04
      相关资源
      最近更新 更多