Merge duplicate scroller types

This commit is contained in:
Andy Hanson
2017-12-21 13:17:31 -08:00
parent f3e0c3d36f
commit 90e995391a
8 changed files with 172 additions and 402 deletions

View File

@@ -1,10 +1,10 @@
// Type definitions for Zynga Scroller
// Project: https://github.com/zynga/scroller
// Definitions by: Boris Yankov <https://github.com/borisyankov>
// Type definitions for Zynga Scroller 0.1
// Project: http://zynga.github.com/scroller/
// Definitions by: Marcelo Haskell Camargo <https://github.com/haskellcamargo>
// Definitions: https://github.com/DefinitelyTyped/DefinitelyTyped
interface ScrollerOptions {
declare namespace Scroller {
interface Options {
scrollingX?: boolean;
scrollingY?: boolean;
animating?: boolean;
@@ -13,46 +13,48 @@ interface ScrollerOptions {
locking?: boolean;
paging?: boolean;
snapping?: boolean;
zooming?: boolean;
zooming?: number;
minZoom?: number;
maxZoom?: number;
speedMultiplier?: number;
}
interface ScrollValues {
left: number;
top: number;
}
interface ScrollValuesWithZoom extends ScrollValues {
zoom: number;
}
}
declare class Scroller {
constructor (callback: (left: number, top: number, zoom: number) => void , options: ScrollerOptions);
constructor(callback: (left: number, top: number, zoom: number) => void, options?: Scroller.Options);
setDimensions(clientWidth: number, clientHeight: number, contentWidth: number, contentHeight: number): void;
setPosition(clientLeft: number, clientTop: number): void;
setSnapSize(width: number, height: number): void;
activatePullToRefresh(height: number, activate: () => void, deactivate: () => void, start: () => void): void;
finishPullToRefresh(): void;
getValues(): {
left: number;
top: number;
zoom: number
};
getScrollMax(): { left: number; top: number; };
zoomTo(level: number, animate?: boolean, originLeft?: number,
originTop?: number, callback?: () => void): void;
zoomBy(factor: number, animate?: boolean, originLeft?: number,
originTop?: number, callback?: () => void): void;
scrollTo(left: number, top: number, animate?: boolean, zoom?: number): void;
scrollBy(leftOffset: number, topOffset: number, animate?: boolean): void;
setDimensions(clientWidth: number, clientHeight: number, contentWidth: number, contentHeight: number): void;
setPosition(left: number, top: number): void;
setSnapSize(width: number, height: number): void;
activatePullToRefresh(height: number, activateCallback: Function, deactivateCallback: Function, startCallback: Function): void;
finishPullToRefresh(): void;
getValues(): ScrollValuesWithZoom;
getScrollMax(): ScrollValues;
zoomTo(level: number, animate?: boolean, originLeft?: number, originTop?: number, callback?: Function): void;
zoomBy(factor: number, animate?: boolean, originLeft?: number, originTop?: number, callback?: Function): void;
scrollTo(left?: number, top?: number, animate?: boolean, zoom?: number): void;
scrollBy(left?: number, top?: number, animate?: boolean): void;
doMouseZoom(wheelDelta: number, timeStamp: number, pageX: number, pageY: number): void;
doTouchStart(touches: any[], timeStamp: number): void;
doTouchMove(touches: any[], timeStamp: number, scale?: number): void;
doTouchEnd(timeStamp: number): void;
doMouseZoom(wheelData: number, timeStamp: number, pageX: number, pageY: number): void;
doTouchStart(touches: Array<{
pageX: number;
pageY: number
}>, timeStamp: number): void;
doTouchMove(touches: Array<{
pageX: number;
pageY: number
}>, timeStamp: number, scale?: number): void;
doTouchEnd(timeStamp: number): void;
}
declare class EasyScroller {
constructor (content: any, options: ScrollerOptions);
constructor(content: any, options: Scroller.Options);
render(): void;
reflow(): void;
bindEvents(): void;
render(): void;
reflow(): void;
bindEvents(): void;
}

View File

@@ -1,11 +1,45 @@
var clientWidth: any;
var clientHeight: any;
var render: any;
let scroller: Scroller = new Scroller((left, top, zoom) => { });
scroller = new Scroller((left, top, zoom) => { }, {
scrollingX: true,
scrollingY: true,
animating: true,
animationDuration: 400,
bouncing: false,
locking: false,
paging: false,
snapping: true,
zooming: 10,
minZoom: 1,
maxZoom: 2
});
var Tiling: any;
scroller.setDimensions(10, 10, 10, 10);
scroller.setPosition(200, 300);
scroller.setSnapSize(300, 300);
scroller.activatePullToRefresh(200, () => { }, () => { }, () => { });
scroller.finishPullToRefresh();
const data: {
left: number;
top: number;
zoom: number
} = scroller.getValues();
scroller.zoomTo(10);
scroller.zoomBy(10);
scroller.doMouseZoom(10, 10, 10, 10);
scroller.doTouchStart([{
pageX: 10,
pageY: 20
}], 200);
scroller.doTouchEnd(300);
declare const clientWidth: number;
declare const clientHeight: number;
declare function render(left: number, top: number, zoom: number): void;
declare const Tiling: any; // TODO: What is this?
function test_basic() {
var scrollerObj = new Scroller(function (left, top, zoom) {
const scrollerObj = new Scroller((left, top, zoom) => {
}, {
scrollingY: false
});
@@ -13,106 +47,106 @@ function test_basic() {
}
function test_canvas() {
var contentWidth = 2000;
var contentHeight = 2000;
var cellWidth = 100;
var cellHeight = 100;
var content = <HTMLCanvasElement>document.getElementById('content');
var context = content.getContext('2d');
var tiling = new Tiling();
var render = function (left, top, zoom) {
const contentWidth = 2000;
const contentHeight = 2000;
const cellWidth = 100;
const cellHeight = 100;
const content = document.getElementById('content') as HTMLCanvasElement;
const context = content.getContext('2d');
const tiling = new Tiling();
function render(left: number, top: number, zoom: number) {
content.width = clientWidth;
content.height = clientHeight;
context.clearRect(0, 0, clientWidth, clientHeight);
tiling.setup(clientWidth, clientHeight, contentWidth, contentHeight, cellWidth, cellHeight);
tiling.render(left, top, zoom, paint);
};
var paint = function (row, col, left, top, width, height, zoom) {
}
function paint(row: number, col: number, left: number, top: number, width: number, height: number, zoom: number) {
context.fillStyle = row % 2 + col % 2 > 0 ? "#ddd" : "#fff";
context.fillRect(left, top, width, height);
context.fillStyle = "black";
context.font = (14 * zoom).toFixed(2) + 'px "Helvetica Neue", Helvetica, Arial, sans-serif';
context.fillText(row + "," + col, left + (6 * zoom), top + (18 * zoom));
};
context.fillText(`${row},${col}`, left + (6 * zoom), top + (18 * zoom));
}
}
function test_domlist() {
var container = document.getElementById("container");
var content = document.getElementById("content");
var refreshElem = <HTMLElement>content.getElementsByTagName("div")[0];
var scroller = new Scroller(render, {
const container = document.getElementById("container");
const content = document.getElementById("content");
const refreshElem = content.getElementsByTagName("div")[0];
const scroller = new Scroller(render, {
scrollingX: false
});
scroller.activatePullToRefresh(50, function () {
scroller.activatePullToRefresh(50, () => {
refreshElem.className += " active";
refreshElem.innerHTML = "Release to Refresh";
}, function () {
}, () => {
refreshElem.className = refreshElem.className.replace(" active", "");
refreshElem.innerHTML = "Pull to Refresh";
}, function () {
}, () => {
refreshElem.className += " running";
refreshElem.innerHTML = "Refreshing...";
setTimeout(function () {
setTimeout(() => {
refreshElem.className = refreshElem.className.replace(" running", "");
insertItems();
scroller.finishPullToRefresh();
}, 2000);
});
var rect = container.getBoundingClientRect();
const rect = container.getBoundingClientRect();
scroller.setPosition(rect.left + container.clientLeft, rect.top + container.clientTop);
var insertItems = function () {
for (var i = 0; i < 15; i++) {
var row = document.createElement("div");
const insertItems = () => {
for (let i = 0; i < 15; i++) {
const row = document.createElement("div");
row.className = "row";
row.style.backgroundColor = i % 2 > 0 ? "#ddd" : "";
row.innerHTML = <any>Math.random();
if (content.firstChild == content.lastChild) {
row.innerHTML = Math.random().toString();
if (content.firstChild === content.lastChild) {
content.appendChild(row);
} else {
content.insertBefore(row, content.childNodes[1])
content.insertBefore(row, content.childNodes[1]);
}
}
scroller.setDimensions(container.clientWidth, container.clientHeight, content.offsetWidth, content.offsetHeight - 50);
};
insertItems();
if ('ontouchstart' in window) {
container.addEventListener("touchstart", function (e) {
container.addEventListener("touchstart", e => {
// Don't react if initial down happens on a form element
if ((<any>e.target).tagName.match(/input|textarea|select/i)) {
if ((e.target as any).tagName.match(/input|textarea|select/i)) {
return;
}
scroller.doTouchStart((<any>e).touches, e.timeStamp);
scroller.doTouchStart((e as any).touches, e.timeStamp);
e.preventDefault();
}, false);
document.addEventListener("touchmove", function (e) {
scroller.doTouchMove((<any>e).touches, e.timeStamp);
document.addEventListener("touchmove", e => {
scroller.doTouchMove((e as any).touches, e.timeStamp);
}, false);
document.addEventListener("touchend", function (e) {
document.addEventListener("touchend", e => {
scroller.doTouchEnd(e.timeStamp);
}, false);
} else {
var mousedown = false;
container.addEventListener("mousedown", function (e) {
if ((<any>e.target).tagName.match(/input|textarea|select/i)) {
let mousedown = false;
container.addEventListener("mousedown", e => {
if ((e.target as any).tagName.match(/input|textarea|select/i)) {
return;
}
scroller.doTouchStart([{
pageX: (<any>e).pageX,
pageY: (<any>e).pageY
pageX: (e as any).pageX,
pageY: (e as any).pageY
}], e.timeStamp);
mousedown = true;
}, false);
document.addEventListener("mousemove", function (e) {
document.addEventListener("mousemove", e => {
if (!mousedown) {
return;
}
scroller.doTouchMove([{
pageX: (<any>e).pageX,
pageY: (<any>e).pageY
pageX: (e as any).pageX,
pageY: (e as any).pageY
}], e.timeStamp);
mousedown = true;
}, false);
document.addEventListener("mouseup", function (e) {
document.addEventListener("mouseup", e => {
if (!mousedown) {
return;
}
@@ -123,63 +157,63 @@ function test_domlist() {
}
function test_dompaging() {
var container = document.getElementById("container");
var content = document.getElementById("content");
var size = 400;
var frag = document.createDocumentFragment();
for (var cell = 0, cl = content.clientWidth / size; cell < cl; cell++) {
var elem = document.createElement("div");
const container = document.getElementById("container");
const content = document.getElementById("content");
const size = 400;
const frag = document.createDocumentFragment();
for (let cell = 0, cl = content.clientWidth / size; cell < cl; cell++) {
const elem = document.createElement("div");
elem.className = "cell";
elem.style.backgroundColor = cell % 2 > 0 ? "#ddd" : "";
elem.innerHTML = <any>cell;
elem.innerHTML = cell.toString();
frag.appendChild(elem);
}
content.appendChild(frag);
var scroller = new Scroller(render, {
const scroller = new Scroller(render, {
scrollingY: false,
paging: true
});
var rect = container.getBoundingClientRect();
const rect = container.getBoundingClientRect();
scroller.setPosition(rect.left + container.clientLeft, rect.top + container.clientTop);
scroller.setDimensions(container.clientWidth, container.clientHeight, content.offsetWidth, content.offsetHeight);
if ('ontouchstart' in window) {
container.addEventListener("touchstart", function (e) {
if ((<any>e.target).tagName.match(/input|textarea|select/i)) {
container.addEventListener("touchstart", e => {
if ((e.target as any).tagName.match(/input|textarea|select/i)) {
return;
}
scroller.doTouchStart((<any>e).touches, e.timeStamp);
scroller.doTouchStart((e as any).touches, e.timeStamp);
e.preventDefault();
}, false);
document.addEventListener("touchmove", function (e) {
scroller.doTouchMove((<any>e).touches, e.timeStamp);
document.addEventListener("touchmove", e => {
scroller.doTouchMove((e as any).touches, e.timeStamp);
}, false);
document.addEventListener("touchend", function (e) {
document.addEventListener("touchend", e => {
scroller.doTouchEnd(e.timeStamp);
}, false);
} else {
var mousedown = false;
container.addEventListener("mousedown", function (e) {
if ((<any>e.target).tagName.match(/input|textarea|select/i)) {
let mousedown = false;
container.addEventListener("mousedown", e => {
if ((e.target as any).tagName.match(/input|textarea|select/i)) {
return;
}
scroller.doTouchStart([{
pageX: (<any>e).pageX,
pageY: (<any>e).pageY
pageX: (e as any).pageX,
pageY: (e as any).pageY
}], e.timeStamp);
mousedown = true;
}, false);
document.addEventListener("mousemove", function (e) {
document.addEventListener("mousemove", e => {
if (!mousedown) {
return;
}
scroller.doTouchMove([{
pageX: (<any>e).pageX,
pageY: (<any>e).pageY
pageX: (e as any).pageX,
pageY: (e as any).pageY
}], e.timeStamp);
mousedown = true;
}, false);
document.addEventListener("mouseup", function (e) {
document.addEventListener("mouseup", e => {
if (!mousedown) {
return;
}
@@ -190,64 +224,64 @@ function test_dompaging() {
}
function test_domsnapping() {
var container = document.getElementById("container");
var content = document.getElementById("content");
var size = 100;
var frag = document.createDocumentFragment();
for (var row = 0, rl = content.clientHeight / size; row < rl; row++) {
for (var cell = 0, cl = content.clientWidth / size; cell < cl; cell++) {
var elem = document.createElement("div");
const container = document.getElementById("container");
const content = document.getElementById("content");
const size = 100;
const frag = document.createDocumentFragment();
for (let row = 0, rl = content.clientHeight / size; row < rl; row++) {
for (let cell = 0, cl = content.clientWidth / size; cell < cl; cell++) {
const elem = document.createElement("div");
elem.className = "cell";
elem.style.backgroundColor = row % 2 + cell % 2 > 0 ? "#ddd" : "";
elem.innerHTML = row + "," + cell;
elem.innerHTML = `${row},${cell}`;
frag.appendChild(elem);
}
}
content.appendChild(frag);
var scroller = new Scroller(render, {
const scroller = new Scroller(render, {
snapping: true
});
var rect = container.getBoundingClientRect();
const rect = container.getBoundingClientRect();
scroller.setPosition(rect.left + container.clientLeft, rect.top + container.clientTop);
scroller.setDimensions(container.clientWidth, container.clientHeight, content.offsetWidth, content.offsetHeight);
scroller.setSnapSize(100, 100);
if ('ontouchstart' in window) {
container.addEventListener("touchstart", function (e) {
if ((<any>e.target).tagName.match(/input|textarea|select/i)) {
container.addEventListener("touchstart", e => {
if ((e.target as any).tagName.match(/input|textarea|select/i)) {
return;
}
scroller.doTouchStart((<any>e).touches, e.timeStamp);
scroller.doTouchStart((e as any).touches, e.timeStamp);
e.preventDefault();
}, false);
document.addEventListener("touchmove", function (e) {
scroller.doTouchMove((<any>e).touches, e.timeStamp);
document.addEventListener("touchmove", e => {
scroller.doTouchMove((e as any).touches, e.timeStamp);
}, false);
document.addEventListener("touchend", function (e) {
document.addEventListener("touchend", e => {
scroller.doTouchEnd(e.timeStamp);
}, false);
} else {
var mousedown = false;
container.addEventListener("mousedown", function (e) {
if ((<any>e.target).tagName.match(/input|textarea|select/i)) {
let mousedown = false;
container.addEventListener("mousedown", e => {
if ((e.target as any).tagName.match(/input|textarea|select/i)) {
return;
}
scroller.doTouchStart([{
pageX: (<any>e).pageX,
pageY: (<any>e).pageY
pageX: (e as any).pageX,
pageY: (e as any).pageY
}], e.timeStamp);
mousedown = true;
}, false);
document.addEventListener("mousemove", function (e) {
document.addEventListener("mousemove", e => {
if (!mousedown) {
return;
}
scroller.doTouchMove([{
pageX: (<any>e).pageX,
pageY: (<any>e).pageY
pageX: (e as any).pageX,
pageY: (e as any).pageY
}], e.timeStamp);
mousedown = true;
}, false);
document.addEventListener("mouseup", function (e) {
document.addEventListener("mouseup", e => {
if (!mousedown) {
return;
}
@@ -255,4 +289,4 @@ function test_domsnapping() {
mousedown = false;
}, false);
}
}
}

View File

@@ -5,7 +5,7 @@
"es6",
"dom"
],
"noImplicitAny": false,
"noImplicitAny": true,
"noImplicitThis": true,
"strictNullChecks": false,
"strictFunctionTypes": true,

View File

@@ -1,79 +1 @@
{
"extends": "dtslint/dt.json",
"rules": {
"adjacent-overload-signatures": false,
"array-type": false,
"arrow-return-shorthand": false,
"ban-types": false,
"callable-types": false,
"comment-format": false,
"dt-header": false,
"eofline": false,
"export-just-namespace": false,
"import-spacing": false,
"interface-name": false,
"interface-over-type-literal": false,
"jsdoc-format": false,
"max-line-length": false,
"member-access": false,
"new-parens": false,
"no-any-union": false,
"no-boolean-literal-compare": false,
"no-conditional-assignment": false,
"no-consecutive-blank-lines": false,
"no-construct": false,
"no-declare-current-package": false,
"no-duplicate-imports": false,
"no-duplicate-variable": false,
"no-empty-interface": false,
"no-for-in-array": false,
"no-inferrable-types": false,
"no-internal-module": false,
"no-irregular-whitespace": false,
"no-mergeable-namespace": false,
"no-misused-new": false,
"no-namespace": false,
"no-object-literal-type-assertion": false,
"no-padding": false,
"no-redundant-jsdoc": false,
"no-redundant-jsdoc-2": false,
"no-redundant-undefined": false,
"no-reference-import": false,
"no-relative-import-in-test": false,
"no-self-import": false,
"no-single-declare-module": false,
"no-string-throw": false,
"no-unnecessary-callback-wrapper": false,
"no-unnecessary-class": false,
"no-unnecessary-generics": false,
"no-unnecessary-qualifier": false,
"no-unnecessary-type-assertion": false,
"no-useless-files": false,
"no-var-keyword": false,
"no-var-requires": false,
"no-void-expression": false,
"no-trailing-whitespace": false,
"object-literal-key-quotes": false,
"object-literal-shorthand": false,
"one-line": false,
"one-variable-per-declaration": false,
"only-arrow-functions": false,
"prefer-conditional-expression": false,
"prefer-const": false,
"prefer-declare-function": false,
"prefer-for-of": false,
"prefer-method-signature": false,
"prefer-template": false,
"radix": false,
"semicolon": false,
"space-before-function-paren": false,
"space-within-parens": false,
"strict-export-declare-modifiers": false,
"trim-file": false,
"triple-equals": false,
"typedef-whitespace": false,
"unified-signatures": false,
"void-return": false,
"whitespace": false
}
}
{ "extends": "dtslint/dt.json" }

View File

@@ -1,50 +0,0 @@
// Type definitions for Zynga Scroller
// Project: http://zynga.github.com/scroller/
// Definitions by: Marcelo Haskell Camargo <https://github.com/haskellcamargo>
// Definitions: https://github.com/DefinitelyTyped/DefinitelyTyped
declare class Scroller {
constructor(a: (left: number, top: number, zoom: number) => void, b?: {
scrollingX?: boolean;
scrollingY?: boolean;
animating?: boolean;
animationDuration?: number;
bouncing?: boolean;
locking?: boolean;
paging?: boolean;
snapping?: boolean;
zooming?: number;
minZoom?: number;
maxZoom?: number
});
setDimensions(clientWidth: number, clientHeight: number, contentWidth: number,
contentHeight: number): void;
setPosition(clientLeft: number, clientTop: number): void;
setSnapSize(width: number, height: number): void;
activatePullToRefresh<T>(height: number, activate: () => void,
deactivate: () => void, start: () => void): void;
finishPullToRefresh(): void;
getValues(): {
left: number;
top: number;
zoom: number
};
zoomTo(level: number, animate?: boolean, originLeft?: number,
originTop?: number): void;
zoomBy(factor: number, animate?: boolean, originLeft?: number,
originTop?: number): void;
scrollTo(left: number, top: number, animate?: boolean): void;
scrollBy(leftOffset: number, topOffset: number, animate?: boolean): void;
doMouseZoom(wheelData: number, timeStamp: number, pageX: number,
pageY: number): void;
doTouchStart(touches: {
pageX: number;
pageY: number
}, timeStamp: number): void;
doTouchMove(touches: {
pageX: number;
pageY: number
}, timeStamp: number, scale?: number): void;
doTouchMove(touches: [any], timeStamp: number): void;
doTouchEnd(timeStamp: number): void;
}

View File

@@ -1,23 +0,0 @@
{
"compilerOptions": {
"module": "commonjs",
"lib": [
"es6"
],
"noImplicitAny": true,
"noImplicitThis": true,
"strictNullChecks": false,
"strictFunctionTypes": true,
"baseUrl": "../",
"typeRoots": [
"../"
],
"types": [],
"noEmit": true,
"forceConsistentCasingInFileNames": true
},
"files": [
"index.d.ts",
"zynga-scroller-tests.ts"
]
}

View File

@@ -1,79 +0,0 @@
{
"extends": "dtslint/dt.json",
"rules": {
"adjacent-overload-signatures": false,
"array-type": false,
"arrow-return-shorthand": false,
"ban-types": false,
"callable-types": false,
"comment-format": false,
"dt-header": false,
"eofline": false,
"export-just-namespace": false,
"import-spacing": false,
"interface-name": false,
"interface-over-type-literal": false,
"jsdoc-format": false,
"max-line-length": false,
"member-access": false,
"new-parens": false,
"no-any-union": false,
"no-boolean-literal-compare": false,
"no-conditional-assignment": false,
"no-consecutive-blank-lines": false,
"no-construct": false,
"no-declare-current-package": false,
"no-duplicate-imports": false,
"no-duplicate-variable": false,
"no-empty-interface": false,
"no-for-in-array": false,
"no-inferrable-types": false,
"no-internal-module": false,
"no-irregular-whitespace": false,
"no-mergeable-namespace": false,
"no-misused-new": false,
"no-namespace": false,
"no-object-literal-type-assertion": false,
"no-padding": false,
"no-redundant-jsdoc": false,
"no-redundant-jsdoc-2": false,
"no-redundant-undefined": false,
"no-reference-import": false,
"no-relative-import-in-test": false,
"no-self-import": false,
"no-single-declare-module": false,
"no-string-throw": false,
"no-unnecessary-callback-wrapper": false,
"no-unnecessary-class": false,
"no-unnecessary-generics": false,
"no-unnecessary-qualifier": false,
"no-unnecessary-type-assertion": false,
"no-useless-files": false,
"no-var-keyword": false,
"no-var-requires": false,
"no-void-expression": false,
"no-trailing-whitespace": false,
"object-literal-key-quotes": false,
"object-literal-shorthand": false,
"one-line": false,
"one-variable-per-declaration": false,
"only-arrow-functions": false,
"prefer-conditional-expression": false,
"prefer-const": false,
"prefer-declare-function": false,
"prefer-for-of": false,
"prefer-method-signature": false,
"prefer-template": false,
"radix": false,
"semicolon": false,
"space-before-function-paren": false,
"space-within-parens": false,
"strict-export-declare-modifiers": false,
"trim-file": false,
"triple-equals": false,
"typedef-whitespace": false,
"unified-signatures": false,
"void-return": false,
"whitespace": false
}
}

View File

@@ -1,36 +0,0 @@
var scroller: Scroller = new Scroller((left, top, zoom) => { });
scroller = new Scroller((left, top, zoom) => { }, {
scrollingX: true,
scrollingY: true,
animating: true,
animationDuration: 400,
bouncing: false,
locking: false,
paging: false,
snapping: true,
zooming: 10,
minZoom: 1,
maxZoom: 2
});
scroller.setDimensions(10, 10, 10, 10);
scroller.setPosition(200, 300);
scroller.setSnapSize(300, 300);
scroller.activatePullToRefresh(200, () => { }, () => { }, () => { });
scroller.finishPullToRefresh();
var data: {
left: number;
top: number;
zoom: number
} = scroller.getValues();
scroller.zoomTo(10);
scroller.zoomBy(10);
scroller.doMouseZoom(10, 10, 10, 10);
scroller.doTouchStart({
pageX: 10,
pageY: 20
}, 200);
scroller.doTouchMove([10], 200);
scroller.doTouchEnd(300);