我使用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,這對我沒有任何幫助。
你怎麼知道有一個歷史?你根本不檢查'getHistorySize()'。如果它的大小爲0,那麼索引0無效(這將是大小1)。 – Geobits
我認爲如果沒有歷史記錄,索引0將是當前的一個 – levengli
不,這只是'getX',而不是'getHistoricalX' – Geobits