d3.js umschreiben zoom Beispiel in der version4
Ich versuche zu umschreiben, dass ein Teil der in diesem Beispiel oben zu verwenden, in meinem code, speziell dieses Stück:
function centerNode(source) {
scale = zoomListener.scale();
x = -source.y0;
y = -source.x0;
x = x * scale + viewerWidth / 2;
y = y * scale + viewerHeight / 2;
d3.select('g').transition()
.duration(duration)
.attr("transform", "translate(" + x + "," + y + ")scale(" + scale + ")");
zoomListener.scale(scale);
zoomListener.translate([x, y]);
}
Jedoch bin ich stecken, da das v4 Paket hat sich ziemlich geändert. Ich schrieb meine zoomListener Funktion
var zoomListener = d3.zoom()
.scaleExtent([0.3,2])
.on("zoom", zoomed);
function zoomed() {
transform = d3.event.transform;
console.log(d3.event);
svg.attr("transform", transform);
}
function centerNode(source){
t = transform;
console.log(t);
x = t.x*t.k; //I only want things to be centered vertically
y = (t.y + -source.x0)*t.k + (viewerHeight)/2 ;
svg.transition()
.duration(duration)
.attr("transform","translate(" + x + "," + y +")scale(" + t.k + ")");
transform.scale(t.k); //DOES NOT WORK
transform.translate([x, y]); //DOES NOT WORK
}
und ich weiß, dass nach der doc sich die Dinge verändert haben und die Informationen nicht länger gespeichert werden, was würden meine zoomListener
D3 V4 release-note auf zoom Ich glaube, ich bin nur verwirrt, wie ich bin, angenommen, es zu tun mit der neuen version. Die letzten paar Zeilen meines centerNode-Funktion nicht funktionieren, das hat als Effekt, dass, wenn ich Mitte der Knoten, die das Zoomen und schwenken zurücksetzen...
Jede Anregung?
Du musst angemeldet sein, um einen Kommentar abzugeben.
So, nach viel Graben und Versuch und Irrtum habe ich die cam mit einer Antwort, die ziemlich gut funktioniert für meine Zwecke. Beachten Sie, dass dieser code ist nur der relevante Teil meines Codes nicht der ganze code, bestimmte variable wurden, erklärt sich von selbst, damit nicht auch Sie. AUCH DIES IST IN der VERSION 4 von d3.js.
Gemäß der Beispiele für die v4 auf die d3.js Seite habe ich ein Rechteck anwenden, das zoom zu
In der Mitte Knoten-Funktion, die ich verwende
d3.zoomTransform(zoomer.node());
um die aktuelle Transformation angewendet auf die Seite.Der Zweck dieser Funktion ist nur die Mitte der reduzierbaren Struktur vertikal nicht horizontal, so bin ich die Beibehaltung der aktuellen Transformation.x (hier
t.x
) die gleichen.Die Koordinate in meinem svg-flip also warum
y= source.x0
source ist ein Knoten, was wurde geklickt in meinem reduzierbaren Struktur. ("Schauen Sie auf das Beispiel verwiesen wird, an die Spitze dieses Threads zu verstehen, was ich bin versucht zu konvertieren auf version 4)Ich bin anwenden der transformation auf meine G-element und soll ich dann zu verpflichten, diese änderungen an den zoom zu transformieren, zu tun, so dass ich die
.on("end", function(){})
ansonsten war es dabei seltsam Verhalten bei dem übergang, damit alle es tut, ist die Einstellung der aktuelle Zustand der Transformation.Diese Zeile vor der Anwendung ist eine übersetzung von x-und y-und a-Skala-gleich ist, ist was der aktuelle Zustand --, um die auf dem Gebiet der Computerkriminalität matrix hat man eine neue Transformation für G, i dann gilt es zu
zoomer
was ist das element, rief ichzoom
auf früher.Dieser arbeitete wie ein Charme für mich!
Aufrufen
transform.scale
undtransform.translate
gibt eine neue Transformation, und ändert nichts. Daher:(An dieser Stelle
zoomListener
ist eine ziemlich ungenaue Bezeichnung für dieses, aber egal...)k
,x
, undy
können abgeleitet werden aussource
, vielleicht, als Sie zeigen, aber ich bin mir nicht sicher, weil ich nicht weiß, wassource
ist. Aber für micht.x*t.k
sieht verdächtig aus, denn es ist die Multiplikation der vorhandenen Transformationen x, die von Ihrer Größe. Wie es scheint, würde eine feedback-Schleife.Mehr über die zoom-in-v4 -, check-out das StackOverflow-post, oder in diesem Beispiel wird mit mbostock demonstriert programmgesteuerte Kontrolle über die zoom-Transformation ein element (canvas) und mit übergängen.
source.x0
undsource.y0
definiert sind. Wie sind Sie lat/lng, Paare oder Pixel? Ich vermute Pixel. Wie auch immer, ich arbeite auf einer ähnlichen Umwandlung selbst, so haben vielleicht mehr Einblick später...zoomTransform
Objekt. Insbesonderetranslate()
kommen sollte, bevorscale()
, andernfalls wird die übersetzung intern multipliziert wird, die von der Skala. Ich veränderte meine Antwort, um dies zu reflektieren.d3.zoomTransform(zoom)
d3.zoomTransform(zoom, svg)
undd3.zoomTransform(svg)
in der Konsole und es ist immer` k': 1 x: 0 y:0`, ich bin mir nicht sicher, wie die Funktion zu nutzen, um die aktuelle Transformation. Sie haben keine Einsicht auf, dass? @meetamitd3.zoomTransform(d3.select("svg").node())
ist, wie die zoomTransform Funktion kann verwendet werden, außerhalb der Ereignis-listener oder d3.event.transformieren (oder gleichwertig d3.zoomTransform(this)) im inneren der Zuhörer. @meetamit