Qualcuno sa come definire un arco/cerchio animato in SVG, in modo che l'arco inizi a 0 gradi e termini a 360 gradi?Definire un'animazione circolare/arco in SVG
risposta
si può dipingere "a mano" utilizzando lineto di percorso e calcolare la posizione dell'arco:
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1"
viewBox="0 0 1200 800"
preserveAspectRatio="xMidYMid"
style="width:100%; height:100%; position:absolute; top:0; left:0;"
onload="drawCircle();">
<script>
function drawCircle() {
var i = 0;
var circle = document.getElementById("arc");
var angle = 0;
var radius = 100;
window.timer = window.setInterval(
function() {
angle -=5;
angle %= 360;
var radians= (angle/180) * Math.PI;
var x = 200 + Math.cos(radians) * radius;
var y = 200 + Math.sin(radians) * radius;
var e = circle.getAttribute("d");
if(i==0) {
var d = e+ " M "+x + " " + y;
}
else {
var d = e+ " L "+x + " " + y;
}
if (angle === -5 && i !== 0) {
window.clearInterval(window.timer);
}
circle.setAttribute("d", d);
i++;
}
,10)
}
</script>
<path d="M200,200 " id="arc" fill="none" stroke="blue" stroke-width="2" />
</svg>
Grazie mille. Sono ancora nuovo in SVG e non ho mai utilizzato l'elemento
Un modo è utilizzare un cerchio e animare lo stroke-dashoffset (è necessario anche "stroke-dasharray"). Un esempio di tale animazione (non con un cerchio, ma lo stesso principio si applica) può essere visto here.
L'altra opzione è quella di utilizzare un'animazione di percorso e arc path segments, per l'animazione/morphing tra i percorsi, vedere questo example.
grazie erik - il collegamento al sito http://www.carto.net/papers/svg/samples mi ha mostrato alcune idee e tecniche interessanti per l'animazione svg. – GarethOwen
Grazie per le risposte - ecco un po 'di più informazioni per quanto riguarda il motivo per cui voglio per animare un cerchio in SVG:
Abbiamo un'applicazione client-server. Ho in programma di generare immagini SVG per rappresentare grafici (grafici a torta/grafici a barre) sul server e inviare l'SVG ai client. Abbiamo client Java e .NET. Scriverò il codice lato client per analizzare e rendere le immagini SVG ricevute dal server. Ho intenzione di utilizzare solo un sottoinsieme del formato SVG, non più di quello che serve per rappresentare i nostri grafici, ma l'animazione è un requisito.
A lungo termine sarebbe bello avere un client ajax, che verrà eseguito sui browser senza runtime java o .NET. Questo è il motivo per cui ho scelto il formato SVG.
Per una soluzione a breve termine, ora penso che aggiungerò il mio elemento all'SVG, definendo un arco utilizzando gli angoli di inizio e di scorrimento. Quindi posso facilmente definire l'animazione richiesta animando l'angolo di sweep e semplifica la mia implementazione.
A lungo termine: se davvero ci stiamo occupando dell'implementazione di un client AJAX/HTML, dovrò reimplementare e attenermi allo standard SVG.
OK! Sono curioso: per quanto riguarda la tua soluzione a breve termine, quando dichiari i tuoi elementi svg - come sarà il tuo cliente a renderli? Analizzi i tuoi xml e li dipingi in modo nativo? –
Sì, analizzerò l'XML e dipingerò gli elementi utilizzando le API grafiche native (Graphics2D in java, GDI + in .NET.) – GarethOwen
Probabilmente dovresti modificare la domanda invece di rispondere. A proposito; puoi usare cerchi semidistrutti per disegnare un arco; La codepen nella mia risposta ti mostra un'animazione. –
O forse si potrebbe scoprire un cerchio pre-disegnato per dare l'effetto desiderato:
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 1000 1000" width="400" height="400">
<rect x="0" y="0" width="1000" height="1000"/>
<circle cx="500" cy="500" r="500" fill="red"/>
<rect x="0" y="500" width="1000" height="500"/>
<rect x="0" y= "0" width="1000" height="500">
<animateTransform attributeName="transform" type="rotate" begin="0s" dur="5s" fill="freeze" from="0,500,500" to="180,500,500"/>
</rect>
</svg>
Scoprire il cerchio è un'idea interessante e mi piace il tuo esempio per il caso del semicerchio. – GarethOwen
ero anche un po 'deluso per non essere in grado di fare semplicemente l'arco di un cerchio con un per cento, o di un angolo .
Al giorno d'oggi, quando ho bisogno di un arco che non fa parte di un percorso più lungo, uso un cerchio e il trucco strokeDasharray per mostrare solo una parte di questo cerchio.
svg {
outline: solid;
height: 100px;
width: 100px;
}
.arc {
fill: transparent;
stroke-width: 5;
stroke: red;
stroke-dasharray: 94.24778 219.91149;
}
<svg viewport="0 0 100 100">
<circle cx="50" cy="50" r="50" class="arc"></circle>
</svg>
potete vedere una versione migliorata here che utilizzano Sass per fare i calcoli.
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<title></title>
<link rel="stylesheet" href="">
</head>
<body>
</body>
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1"
viewBox="0 0 1200 800"
preserveAspectRatio="xMidYMid"
style="width:100%; height:100%; position:absolute; top:0; left:0;"
onload="drawCircle();">
<script>
function drawCircle() {
// center point
var cX = 300,
cY = 300;
radius = 300,
p1 = {x: cX+radius, y: cY},
p2 = {x: cX-radius, y: cY},
circle = document.getElementById("arc"),
angle = 0;
window.timer = window.setInterval(
function() {
angle -= 5;
angle %= 360;
var radians= (angle/180) * Math.PI;
var x = cX + Math.cos(radians) * radius;
var y = cY + Math.sin(radians) * radius;
if (Math.abs(angle) < 180 && angle != 0)
d= 'M ' + p1.x + ',' + p1.y + ' A' + radius+ ',' + radius+ (Math.abs(angle)==180?' 0 1 0 ':' 0 0 0 ')+x+' '+y;
else
d= 'M ' + p1.x + ',' + p1.y + ' A' + radius+ ',' + radius+ ' 0 1 0 '+p2.x+' '+p2.y +
' M ' + p2.x + ',' + p2.y + ' A' + radius+ ',' + radius+ (Math.abs(angle)==0?' 0 1 0 ':' 0 0 0 ')+x+' '+y;
circle.setAttribute("d", d);
if (Math.abs(angle) == 0)
window.clearInterval(window.timer);
}
,10)
}
</script>
<path d="" id="arc" fill="none" stroke="blue" stroke-width="2" />
</svg>
</html>
È anche possibile disegnare la SVG a mano con un circle
e la seguente tecnica:
- Dare il
circle
unstroke
. - Creare
stroke
dashed
con una lunghezza del trattino pari alla circonferenza del cerchio. - Offset del
stroke
di una lunghezza uguale alla circonferenza del cerchio. - Animare il tratto.
HTML:
<svg width="200" height="200">
<circle class="path" cx="100" cy="100" r="96" stroke="blue" stroke-width="4" fill="none" />
</svg>
CSS:
circle {
stroke-dasharray: /* circumference */;
stroke-dashoffset: /* circumference */;
animation: dash 5s linear forwards;
}
@keyframes dash {
to {
stroke-dashoffset: /* length at which to stop the animation */;
}
}
- 1. Includi file SVG in SVG
- 2. Prestazioni in linea SVG vs file SVG
- 3. Spazio HTML in bianco SVG in linea SVG
- 4. SVG in JPG/PNG
- 5. SVG in Fancybox
- 6. Multiple classes in SVG
- 7. Trasformazioni SVG in JavaScript
- 8. Problemi SVG in ie11
- 9. Ridimensionamento SVG in javascript
- 10. SVG in linea in Firefox
- 11. Come utilizzare `local` defs` in SVG
- 12. Ridimensionamento a nove sezioni SVG
- 13. Calcolare centro di SVG dell'arco
- 14. Qual è il significato di svg: svg?
- 15. SVG trascinabile utilizzando JQuery e Jquery-svg
- 16. Aggiungi elemento SVG SVG esistente utilizzando DOM
- 17. Interagire con un'immagine .svg
- 18. SVG non visualizzato in IE
- 19. Transizione filtro SVG in Firefox
- 20. convertire pdf in formato svg
- 21. Come visualizzare unicode in SVG?
- 22. Disegno SVG in .NET/C#?
- 23. Decodifica immagine SVG in bitmap
- 24. Esporta elementi SVG in PDF?
- 25. clipPath in più tag SVG
- 26. Immagini SVG in un'applicazione iPhone
- 27. Come ottenere ScrollBars in SVG?
- 28. Disegnare rettangoli dinamicamente in SVG
- 29. SVG interrotto
- 30. Come definire enum in swagger.io?
voglio animare l'angolo di apertura, ma in SVG è definito un arco utilizzando i punti iniziale e finale. – GarethOwen