Loading core/java/android/view/VelocityTracker.java +35 −57 Original line number Diff line number Diff line Loading @@ -61,6 +61,7 @@ public final class VelocityTracker implements Poolable<VelocityTracker> { float mYVelocity[] = new float[MotionEvent.BASE_AVAIL_POINTERS]; float mXVelocity[] = new float[MotionEvent.BASE_AVAIL_POINTERS]; int mLastTouch; private VelocityTracker mNext; Loading Loading @@ -105,8 +106,11 @@ public final class VelocityTracker implements Poolable<VelocityTracker> { * Reset the velocity tracker back to its initial state. */ public void clear() { for (int i = 0; i < MotionEvent.BASE_AVAIL_POINTERS; i++) { mPastTime[i][0] = 0; final long[][] pastTime = mPastTime; for (int p = 0; p < MotionEvent.BASE_AVAIL_POINTERS; p++) { for (int i = 0; i < NUM_PAST; i++) { pastTime[p][i] = 0; } } } Loading @@ -133,42 +137,11 @@ public final class VelocityTracker implements Poolable<VelocityTracker> { } private void addPoint(int pos, float x, float y, long time) { int drop = -1; int i; if (localLOGV) Log.v(TAG, "Adding past y=" + y + " time=" + time); final long[] pastTime = mPastTime[pos]; for (i=0; i<NUM_PAST; i++) { if (pastTime[i] == 0) { break; } else if (pastTime[i] < time-LONGEST_PAST_TIME) { if (localLOGV) Log.v(TAG, "Dropping past too old at " + i + " time=" + pastTime[i]); drop = i; } } if (localLOGV) Log.v(TAG, "Add index: " + i); if (i == NUM_PAST && drop < 0) { drop = 0; } if (drop == i) drop--; final float[] pastX = mPastX[pos]; final float[] pastY = mPastY[pos]; if (drop >= 0) { if (localLOGV) Log.v(TAG, "Dropping up to #" + drop); final int start = drop+1; final int count = NUM_PAST-drop-1; System.arraycopy(pastX, start, pastX, 0, count); System.arraycopy(pastY, start, pastY, 0, count); System.arraycopy(pastTime, start, pastTime, 0, count); i -= (drop+1); } pastX[i] = x; pastY[i] = y; pastTime[i] = time; i++; if (i < NUM_PAST) { pastTime[i] = 0; } final int lastTouch = (mLastTouch + 1) % NUM_PAST; mPastX[pos][lastTouch] = x; mPastY[pos][lastTouch] = y; mPastTime[pos][lastTouch] = time; mLastTouch = lastTouch; } /** Loading Loading @@ -199,36 +172,41 @@ public final class VelocityTracker implements Poolable<VelocityTracker> { final float[] pastX = mPastX[pos]; final float[] pastY = mPastY[pos]; final long[] pastTime = mPastTime[pos]; final int lastTouch = mLastTouch; // find oldest acceptable time int oldestTouch = lastTouch; if (pastTime[lastTouch] > 0) { // cleared ? oldestTouch = (lastTouch + 1) % NUM_PAST; final float acceptableTime = pastTime[lastTouch] - LONGEST_PAST_TIME; while (pastTime[oldestTouch] < acceptableTime) { oldestTouch = (oldestTouch + 1) % NUM_PAST; } } // Kind-of stupid. final float oldestX = pastX[0]; final float oldestY = pastY[0]; final long oldestTime = pastTime[0]; final float oldestX = pastX[oldestTouch]; final float oldestY = pastY[oldestTouch]; final long oldestTime = pastTime[oldestTouch]; float accumX = 0; float accumY = 0; int N=0; while (N < NUM_PAST) { if (pastTime[N] == 0) { break; } N++; } float N = (lastTouch - oldestTouch + NUM_PAST) % NUM_PAST + 1; // Skip the last received event, since it is probably pretty noisy. if (N > 3) N--; for (int i=1; i < N; i++) { final int dur = (int)(pastTime[i] - oldestTime); final int j = (oldestTouch + i) % NUM_PAST; final int dur = (int)(pastTime[j] - oldestTime); if (dur == 0) continue; float dist = pastX[i] - oldestX; float dist = pastX[j] - oldestX; float vel = (dist/dur) * units; // pixels/frame. if (accumX == 0) accumX = vel; else accumX = (accumX + vel) * .5f; accumX = (accumX == 0) ? vel : (accumX + vel) * .5f; dist = pastY[i] - oldestY; dist = pastY[j] - oldestY; vel = (dist/dur) * units; // pixels/frame. if (accumY == 0) accumY = vel; else accumY = (accumY + vel) * .5f; accumY = (accumY == 0) ? vel : (accumY + vel) * .5f; } mXVelocity[pos] = accumX < 0.0f ? Math.max(accumX, -maxVelocity) : Math.min(accumX, maxVelocity); mYVelocity[pos] = accumY < 0.0f ? Math.max(accumY, -maxVelocity) Loading Loading
core/java/android/view/VelocityTracker.java +35 −57 Original line number Diff line number Diff line Loading @@ -61,6 +61,7 @@ public final class VelocityTracker implements Poolable<VelocityTracker> { float mYVelocity[] = new float[MotionEvent.BASE_AVAIL_POINTERS]; float mXVelocity[] = new float[MotionEvent.BASE_AVAIL_POINTERS]; int mLastTouch; private VelocityTracker mNext; Loading Loading @@ -105,8 +106,11 @@ public final class VelocityTracker implements Poolable<VelocityTracker> { * Reset the velocity tracker back to its initial state. */ public void clear() { for (int i = 0; i < MotionEvent.BASE_AVAIL_POINTERS; i++) { mPastTime[i][0] = 0; final long[][] pastTime = mPastTime; for (int p = 0; p < MotionEvent.BASE_AVAIL_POINTERS; p++) { for (int i = 0; i < NUM_PAST; i++) { pastTime[p][i] = 0; } } } Loading @@ -133,42 +137,11 @@ public final class VelocityTracker implements Poolable<VelocityTracker> { } private void addPoint(int pos, float x, float y, long time) { int drop = -1; int i; if (localLOGV) Log.v(TAG, "Adding past y=" + y + " time=" + time); final long[] pastTime = mPastTime[pos]; for (i=0; i<NUM_PAST; i++) { if (pastTime[i] == 0) { break; } else if (pastTime[i] < time-LONGEST_PAST_TIME) { if (localLOGV) Log.v(TAG, "Dropping past too old at " + i + " time=" + pastTime[i]); drop = i; } } if (localLOGV) Log.v(TAG, "Add index: " + i); if (i == NUM_PAST && drop < 0) { drop = 0; } if (drop == i) drop--; final float[] pastX = mPastX[pos]; final float[] pastY = mPastY[pos]; if (drop >= 0) { if (localLOGV) Log.v(TAG, "Dropping up to #" + drop); final int start = drop+1; final int count = NUM_PAST-drop-1; System.arraycopy(pastX, start, pastX, 0, count); System.arraycopy(pastY, start, pastY, 0, count); System.arraycopy(pastTime, start, pastTime, 0, count); i -= (drop+1); } pastX[i] = x; pastY[i] = y; pastTime[i] = time; i++; if (i < NUM_PAST) { pastTime[i] = 0; } final int lastTouch = (mLastTouch + 1) % NUM_PAST; mPastX[pos][lastTouch] = x; mPastY[pos][lastTouch] = y; mPastTime[pos][lastTouch] = time; mLastTouch = lastTouch; } /** Loading Loading @@ -199,36 +172,41 @@ public final class VelocityTracker implements Poolable<VelocityTracker> { final float[] pastX = mPastX[pos]; final float[] pastY = mPastY[pos]; final long[] pastTime = mPastTime[pos]; final int lastTouch = mLastTouch; // find oldest acceptable time int oldestTouch = lastTouch; if (pastTime[lastTouch] > 0) { // cleared ? oldestTouch = (lastTouch + 1) % NUM_PAST; final float acceptableTime = pastTime[lastTouch] - LONGEST_PAST_TIME; while (pastTime[oldestTouch] < acceptableTime) { oldestTouch = (oldestTouch + 1) % NUM_PAST; } } // Kind-of stupid. final float oldestX = pastX[0]; final float oldestY = pastY[0]; final long oldestTime = pastTime[0]; final float oldestX = pastX[oldestTouch]; final float oldestY = pastY[oldestTouch]; final long oldestTime = pastTime[oldestTouch]; float accumX = 0; float accumY = 0; int N=0; while (N < NUM_PAST) { if (pastTime[N] == 0) { break; } N++; } float N = (lastTouch - oldestTouch + NUM_PAST) % NUM_PAST + 1; // Skip the last received event, since it is probably pretty noisy. if (N > 3) N--; for (int i=1; i < N; i++) { final int dur = (int)(pastTime[i] - oldestTime); final int j = (oldestTouch + i) % NUM_PAST; final int dur = (int)(pastTime[j] - oldestTime); if (dur == 0) continue; float dist = pastX[i] - oldestX; float dist = pastX[j] - oldestX; float vel = (dist/dur) * units; // pixels/frame. if (accumX == 0) accumX = vel; else accumX = (accumX + vel) * .5f; accumX = (accumX == 0) ? vel : (accumX + vel) * .5f; dist = pastY[i] - oldestY; dist = pastY[j] - oldestY; vel = (dist/dur) * units; // pixels/frame. if (accumY == 0) accumY = vel; else accumY = (accumY + vel) * .5f; accumY = (accumY == 0) ? vel : (accumY + vel) * .5f; } mXVelocity[pos] = accumX < 0.0f ? Math.max(accumX, -maxVelocity) : Math.min(accumX, maxVelocity); mYVelocity[pos] = accumY < 0.0f ? Math.max(accumY, -maxVelocity) Loading