2016-11-09 1 views
1

Je souhaite créer une flèche de dégradé animée. Je veux créer un arrière-plan animé pour la flèche. J'ai utilisé le code suivant, mais il n'affiche pas de dégradé animé en arrière-plan de la flèche.Créer des dégradés animés arrow

Canvas { 
    id: arrowDown 
    width: parent.height/3 
    height: width 
    antialiasing: true 
    ... 
    property real centerWidth: width/2 
    property real centerHeight: height/2 
    property real radius: (Math.min(arrowDown.width, arrowDown.height)*2)/(2*Math.PI) 
    onPaint: { 
     var ctx = getContext("2d"); 
     ctx.save(); 
     ctx.clearRect(0, 0, arrowDown.width, arrowDown.height); 
     ctx.beginPath(); 
     ctx.lineWidth = 8; 
     ctx.moveTo(arrowDown.centerWidth,arrowDown.centerHeight-arrowDown.radius/2); 
     ctx.strokeStyle = secondaryColor 
     ctx.lineTo(arrowDown.centerWidth, 
        arrowDown.centerHeight+arrowDown.radius/2); 
     ctx.lineTo(arrowDown.centerWidth+arrowDown.centerWidth/4, 
        arrowDown.centerHeight+arrowDown.radius/4); 
     ctx.moveTo(arrowDown.centerWidth, 
        arrowDown.centerHeight+arrowDown.radius/2); 
     ctx.lineTo(arrowDown.centerWidth-arrowDown.centerWidth/4, 
        arrowDown.centerHeight+arrowDown.radius/4); 
     var gradient = ctx.createLinearGradient(0, 0, 100, 100); 
     gradient.addColorStop(0.3, Qt.rgba(1, 0, 0, 1)); 
     gradient.addColorStop(0.7, "white"); 
     ctx.stroke(); 
     ctx.restore(); 
    } 
    Timer { 
     ...... 
} 
+0

D'où vient 'arrowDown' venir? Vous devez fournir un exemple minimal et complet. – Mitch

Répondre

3

Et pendant que vous fournissez mcve, j'ai vous donner un exemple proche de gradient animant Canvas:

import QtQuick 2.7 
import QtQuick.Window 2.2 

Window { 
    visible: true 
    width: 600 
    height: 400 

    Canvas { 
     id: canvas 
     width: 200 
     height: 100 
     anchors.centerIn: parent 
     property double pos: 0.5 
     onPaint: { 
      var ctx = getContext("2d"); 
      var grd = ctx.createLinearGradient(0, height/2, width, height/2); 
      grd.addColorStop(0, "red"); 
      grd.addColorStop(canvas.pos, "orange"); 
      grd.addColorStop(1,"red "); 
      ctx.fillStyle=grd; 
      ctx.fillRect(0, 0, width, height); 
     } 
     onPosChanged: { 
      canvas.requestPaint(); 
     } 
    } 


    NumberAnimation { 
     id: anim 
     running: true 
     target: canvas 
     property: "pos" 
     duration: 1000 
     from: 0.9 
     to: 0.1 
     easing.type: Easing.InOutQuad 

     onStopped: { 
      var temp = anim.from; 
      anim.from = anim.to; 
      anim.to = temp; 
      anim.running = true; 
     } 
    } 
}