Sfoglia il codice sorgente

Fix Grid flick scrolling on iOS devices (#16762)

Change-Id: Iee64f1dc5ce91472c66f43a6269cb1eccb2f9b52
tags/7.5.0.alpha1
Teemu Suo-Anttila 9 anni fa
parent
commit
3397a649b5
1 ha cambiato i file con 27 aggiunte e 30 eliminazioni
  1. 27
    30
      client/src/com/vaadin/client/widgets/Escalator.java

+ 27
- 30
client/src/com/vaadin/client/widgets/Escalator.java Vedi File

@@ -335,7 +335,6 @@ public class Escalator extends Widget implements RequiresResize, DeferredWorker
private double touches = 0;
private int lastX = 0;
private int lastY = 0;
private double lastTime = 0;
private boolean snappedScrollEnabled = true;
private double deltaX = 0;
private double deltaY = 0;
@@ -345,7 +344,10 @@ public class Escalator extends Widget implements RequiresResize, DeferredWorker
private CustomTouchEvent latestTouchMoveEvent;

/** The timestamp of {@link #flickPageX1} and {@link #flickPageY1} */
private double flickTimestamp = Double.MIN_VALUE;
private double flickStartTime = 0;

/** The timestamp of {@link #flickPageX2} and {@link #flickPageY2} */
private double flickTimestamp = 0;

/** The most recent flick touch reference Y */
private double flickPageY1 = -1;
@@ -368,6 +370,7 @@ public class Escalator extends Widget implements RequiresResize, DeferredWorker
* over here.
*/
private AnimationCallback mover = new AnimationCallback() {

@Override
public void execute(double timestamp) {
if (touches != 1) {
@@ -378,17 +381,16 @@ public class Escalator extends Widget implements RequiresResize, DeferredWorker
final int y = latestTouchMoveEvent.getPageY();

/*
* Check if we need a new flick coordinate sample (more than
* FLICK_POLL_FREQUENCY ms have passed since the last
* sample)
* Check if we need a new flick coordinate sample ( more
* than FLICK_POLL_FREQUENCY ms have passed since the last
* sample )
*/
if (timestamp - flickTimestamp > FLICK_POLL_FREQUENCY) {
flickTimestamp = timestamp;
flickPageY2 = flickPageY1;
flickPageY1 = y;
if (System.currentTimeMillis() - flickTimestamp > FLICK_POLL_FREQUENCY) {

flickPageX2 = flickPageX1;
flickPageX1 = x;
flickTimestamp = System.currentTimeMillis();
// Set target coordinates
flickPageY2 = y;
flickPageX2 = x;
}

deltaX = x - lastX;
@@ -396,12 +398,6 @@ public class Escalator extends Widget implements RequiresResize, DeferredWorker
lastX = x;
lastY = y;

/*
* Instead of using the provided arbitrary timestamp, let's
* use a known-format and reproducible timestamp.
*/
lastTime = Duration.currentTimeMillis();

// snap the scroll to the major axes, at first.
if (snappedScrollEnabled) {
final double oldDeltaX = deltaX;
@@ -477,6 +473,14 @@ public class Escalator extends Widget implements RequiresResize, DeferredWorker
lastX = event.getPageX();
lastY = event.getPageY();

// Reset flick parameters
flickPageX1 = lastX;
flickPageX2 = -1;
flickPageY1 = lastY;
flickPageY2 = -1;
flickStartTime = System.currentTimeMillis();
flickTimestamp = 0;

snappedScrollEnabled = true;
}

@@ -514,25 +518,18 @@ public class Escalator extends Widget implements RequiresResize, DeferredWorker

final double finalPageY;
final double finalPageX;
double deltaT = lastTime - flickTimestamp;
double deltaT = flickTimestamp - flickStartTime;
boolean onlyOneSample = flickPageX2 < 0 || flickPageY2 < 0;
if (onlyOneSample || deltaT > FLICK_POLL_FREQUENCY / 3) {
finalPageY = flickPageY1;
finalPageX = flickPageX1;
if (onlyOneSample) {
finalPageX = latestTouchMoveEvent.getPageX();
finalPageY = latestTouchMoveEvent.getPageY();
} else {
deltaT += FLICK_POLL_FREQUENCY;
finalPageY = flickPageY2;
finalPageX = flickPageX2;
}

flickPageY1 = -1;
flickPageY2 = -1;
flickTimestamp = Double.MIN_VALUE;

double deltaX = latestTouchMoveEvent.getPageX()
- finalPageX;
double deltaY = latestTouchMoveEvent.getPageY()
- finalPageY;
double deltaX = finalPageX - flickPageX1;
double deltaY = finalPageY - flickPageY1;

escalator.scroller
.handleFlickScroll(deltaX, deltaY, deltaT);

Loading…
Annulla
Salva