Skip to content

Commit 95812fd

Browse files
committed
Add pinch-to-zoom support for Android.
1 parent 84f4a62 commit 95812fd

3 files changed

Lines changed: 25 additions & 6 deletions

File tree

d3.js

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1136,7 +1136,7 @@ d3 = function() {
11361136
};
11371137
var d3_selectionRoot = d3.select(d3_documentElement);
11381138
d3.behavior.zoom = function() {
1139-
var translate = [ 0, 0 ], translate0, scale = 1, scale0, scaleExtent = d3_behavior_zoomInfinity, event = d3_eventDispatch(zoom, "zoom"), x0, x1, y0, y1, touchtime;
1139+
var translate = [ 0, 0 ], translate0, scale = 1, distance0, scale0, scaleExtent = d3_behavior_zoomInfinity, event = d3_eventDispatch(zoom, "zoom"), x0, x1, y0, y1, touchtime;
11401140
function zoom() {
11411141
this.on("mousedown.zoom", mousedown).on("mousemove.zoom", mousemove).on(d3_behavior_zoomWheel + ".zoom", mousewheel).on("dblclick.zoom", dblclick).on("touchstart.zoom", touchstart).on("touchmove.zoom", touchmove).on("touchend.zoom", touchstart);
11421142
}
@@ -1237,6 +1237,7 @@ d3 = function() {
12371237
var touches = d3.touches(this), now = Date.now();
12381238
scale0 = scale;
12391239
translate0 = {};
1240+
distance0 = 0;
12401241
touches.forEach(function(t) {
12411242
translate0[t.identifier] = location(t);
12421243
});
@@ -1248,15 +1249,22 @@ d3 = function() {
12481249
dispatch(event.of(this, arguments));
12491250
}
12501251
touchtime = now;
1252+
} else if (touches.length > 1) {
1253+
var p = touches[0], q = touches[1], dx = p[0] - q[0], dy = p[1] - q[1];
1254+
distance0 = dx * dx + dy * dy;
12511255
}
12521256
}
12531257
function touchmove() {
12541258
var touches = d3.touches(this), p0 = touches[0], l0 = translate0[p0.identifier];
12551259
if (p1 = touches[1]) {
1256-
var p1, l1 = translate0[p1.identifier];
1260+
var p1, l1 = translate0[p1.identifier], scale = d3.event.scale;
1261+
if (scale == null) {
1262+
var distance = (distance = p1[0] - p0[0]) * distance + (distance = p1[1] - p0[1]) * distance;
1263+
scale = distance0 && Math.sqrt(distance / distance0);
1264+
}
12571265
p0 = [ (p0[0] + p1[0]) / 2, (p0[1] + p1[1]) / 2 ];
12581266
l0 = [ (l0[0] + l1[0]) / 2, (l0[1] + l1[1]) / 2 ];
1259-
scaleTo(d3.event.scale * scale0);
1267+
scaleTo(scale * scale0);
12601268
}
12611269
translateTo(p0, l0);
12621270
touchtime = null;

0 commit comments

Comments
 (0)