2010-11-09 4 views
1

J'ai rencontré un effet indésirable d'utiliser JointStyle.MITER lors de l'effacement/redessiner des graphiques.ActionScript - Effacement des graphiques avec un bogue JointStyle.MITER?

Mon projet consiste à gérer des graphiques linéaires personnalisés avec des arêtes arrondies et des arêtes vives, c'est pourquoi je voudrais utiliser un style de joint d'onglet.

Lorsque l'épaisseur de ligne est fortement augmentée, même les zones rondes de la ligne sont affectées par le style d'onglet. Bien que je trouve cela regrettable, c'est compréhensible et pas le bug dont je parle. le bogue (?) se produit lorsque la diminution de l'épaisseur de la ligne n'efface pas complètement les graphiques, comme indiqué par le code chaque fois que l'épaisseur change, laissant des artefacts des graphiques de ligne où la ligne était autrefois. Les artefacts sont également laissés par des arêtes vives, pas seulement des coins arrondis. J'utilise la version 10.1.53.64 de Flash Player sur Mac OS X Snow Leopard (10.6.4).

Vous pouvez tester cela en exécutant mon exemple de code ci-dessous. utilisez les flèches gauche et droite du clavier pour modifier l'épaisseur du contour d'un rect rectangle.

Mise à jour: Les artefacts graphiques sont superficiels. Faites glisser la forme sur leur emplacement après leur apparition pour les supprimer. Code mis à jour avec la fonctionnalité de glisser.

package 
{ 
import flash.display.CapsStyle; 
import flash.display.JointStyle; 
import flash.display.LineScaleMode; 
import flash.display.Sprite; 
import flash.events.Event; 
import flash.events.KeyboardEvent; 
import flash.events.MouseEvent; 
import flash.ui.Keyboard; 

public class StrokeWidth extends Sprite 
    { 
    private var roundRect:Sprite = new Sprite(); 
    private var strokeThickness:Number = 6; 

    public function StrokeWidth() 
     { 
     addEventListener(Event.ADDED_TO_STAGE, init); 
     } 

    private function init(evt:Event):void 
     { 
     removeEventListener(Event.ADDED_TO_STAGE, init); 
     stage.addEventListener(KeyboardEvent.KEY_DOWN, keyDownEventListener); 
     roundRect.addEventListener(MouseEvent.MOUSE_DOWN, mouseEventListener); 
     roundRect.addEventListener(MouseEvent.MOUSE_UP, mouseEventListener); 

     drawRoundRect(); 
     roundRect.x = roundRect.y = 100; 
     addChild(roundRect); 
     } 

    private function drawRoundRect():void 
     { 
     roundRect.graphics.clear(); 
     roundRect.graphics.lineStyle(strokeThickness, 0x000000, 1.0, true, LineScaleMode.NONE, CapsStyle.NONE, JointStyle.MITER); 
     roundRect.graphics.beginFill(0xFF0000); 
     roundRect.graphics.drawRoundRect(0, 0, 400, 200, 100); 
     } 

    private function mouseEventListener(evt:MouseEvent):void 
     { 
     switch (evt.type) 
       { 
       case MouseEvent.MOUSE_DOWN: roundRect.startDrag(); break; 
       case MouseEvent.MOUSE_UP: roundRect.stopDrag(); 
       } 
     } 

    private function keyDownEventListener(evt:KeyboardEvent):void 
     { 
     switch (evt.keyCode) 
       { 
       case Keyboard.LEFT:  strokeThickness -= 1;  break; 
       case Keyboard.RIGHT: strokeThickness += 1; 
       } 

     drawRoundRect(); 
     } 
    } 
} 

alt text

Répondre

1

intéressant. le problème a été causé parce que le mode d'échelle de lineStyle a été fixé à aucun:

LineScaleMode.NONE 

changer à des corrections normales, le problème:

LineScaleMode.NORMAL 
+0

MERCI !! Cherchait juste la solution au même problème. La solution a fonctionné parfaitement! :-) –

0

Qu'en est-il de recréer la forme?

+0

imaginer interpoler l'épaisseur de la ligne. Je crois qu'il sera beaucoup plus rapide et facile de gérer simplement effacer les graphiques et redessiner au lieu de supprimer la forme précédente de la liste d'affichage, instancier une nouvelle forme, dessiner la forme et l'ajouter à la liste d'affichage. Je veux dire, n'est-ce pas la fonction de clear()? – TheDarkIn1978

+0

@ TheDarkInI1978: peut-être masquer? – www0z0k

+0

c'est une idée, mais à ce stade, je suis plus intéressé à savoir si c'est un bug réel ou non. d'ailleurs, je ne suis pas sûr si le masquage fonctionnerait même puisque ces artefacts graphiques sont superficiels. Si vous convertissez la forme en une image-objet et que vous la faites glisser, la forme agit comme une gomme des artefacts lorsqu'elle est déplacée sur eux. – TheDarkIn1978