Flashhilfe.de - Flash Community

Hilfe beim Skript anpassen [Flash 11]

 


AntwortenRegistrieren Seite1 2  

fotofoto#1
Benutzerbild von fotofoto
Beiträge: 22
Registriert: Mar 2011

28.03.2011, 08:25

Guten Morgen,

Gleich vorweg hab zwar einige erfahrung in anderen Skriptsprachen bin aber relativ neu in AS3 ...

Ich will ein Gallery Script anpassen komm aber einfach nicht weiter.

Es handelt sich um ein eigentlich einfaches Slide Script das jedoch die Bildvorschau nur
Quatratisch einzeigt und das wollte ich jetzt ändern dazu gebe ich die Bildbreite in der
xml Datei an und hole sie mir im loop wo die xml daten abgefragt werden wieder raus.

So weit so gut das problem ist nur das die Breite jetzt an 2 stellen dynamisch eingefügt werden
sollten was ich aber nicht hinbekomme ...

Mein erster Lösungsansatz war eine globale Variable die es ja in AS3 nicht mehr gibt also über
einen kleinen Umweg über eine Public Class was aber nicht funktioniert da das script die xml
Daten so wie es aussieht auf einmal abfragt und an den loader übergibt somit habe ich immer nur die Breite des letzten Bildes in allen Bildern (kein loop).

Eine andere Möglichkeit fällt mir ehrlich gesagt nicht ein :-( und bitte um eure Hilfe.

Die Breite (Variable ws) sollte an folgenden punkten eingefügt werden:

Zeile 121 wert für Imageloader.y = ws
Zeile 136 der erste 100 Wert soll durch ws ersetzt werden.

Das Skript meine Kommentare in Deutsch:

ActionScript:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
import flash.net.URLLoader;
import flash.net.URLRequest;
import flash.display.Loader;
import fl.transitions.Tween;
import fl.transitions.easing.*;
import flash.events.MouseEvent;
import flash.display.Sprite;
import flash.events.Event;
import caurina.transitions.*;
import global.gvar; //Globale Variablen
var imageLoader:Loader;
var fadeTween:Tween;


var xmlList:XMLList;
var xml:XML = new XML();

var xmlLoader:URLLoader = new URLLoader();
xmlLoader.addEventListener(Event.COMPLETE, LoadXML);

var xmlPath:String = "data/images.xml";
xmlLoader.load(new URLRequest(xmlPath));
//trace("loading xml from: " + xmlPath);

function LoadXML(event:Event):void
{
     //trace("xml loading complete");
   xml = new XML(event.target.data);
 
     //trace(xmlData.image);
   buildScroller(xml.image);
}

var scroller:MovieClip = new MovieClip();

var speed:Number;
var padding:Number = 20;
var thumbFadeOut:Number = .2;
var thumbFadeIn:Number = 1;
var thumbSmall:Number = 1;
var thumbLarge:Number = 1.1;
this.addChild(scroller);
scroller.y = 20;
//build scroller from xml
function buildScroller(imageList:XMLList):void
{
     //trace("build Scroller");
   for (var i:uint = 0; i < imageList.length(); i++)
     {
        var thisOne:MovieClip = new MovieClip();
 
        //outline
      // Hier wird die Breite aus dem xml geholt und an die "globale Variable" übergeben      
                         var ws:Number;
        ws = imageList[i].attribute("w");
        //Globale Variable ws für Breite vergeben
      gvar.glva.wsg = ws
        trace (gvar.glva.wsg);
                           //----------------------------   
      var blackBox:Sprite = new Sprite();
        blackBox.graphics.beginFill(0xFFFFFF);
        blackBox.graphics.drawRect( 0, 0, ws, 100);
        thisOne.addChild(blackBox);
 
        
        thisOne.itemNum = i;
        thisOne.link = imageList[i].attribute("image");
        thisOne.src = imageList[i].attribute("thumb");
          thisOne.x = (100 + 20) * i;
 
        //image container
      var thisThumb:Sprite = new Sprite();
        //add image
      var ldr:Loader = new Loader();
        var urlReq:URLRequest = new URLRequest(thisOne.src);
        //trace("loading thumbnail " + i + " into Scroller: " + thisOne.src);
      ldr.load(urlReq);
        //assign event listeners for Loader
      ldr.contentLoaderInfo.addEventListener(Event.COMPLETE, completeHandler);
        ldr.contentLoaderInfo.addEventListener(IOErrorEvent.IO_ERROR, errorHandler);
        thisThumb.addChild(ldr);
        thisOne.addChild(thisThumb);
 
        //create listeners for this thumb
      thisOne.buttonMode = true;
        thisOne.addEventListener(MouseEvent.MOUSE_OVER, overScrollerItem);
        thisOne.addEventListener(MouseEvent.MOUSE_OUT, outScrollerItem);
        thisOne.addEventListener(MouseEvent.CLICK, clickScrollerItem);
        
 
        //add item
      scroller.addChild(thisOne);
     }
     scroller.addEventListener(Event.ENTER_FRAME, moveScrollerThumbs);
     //trace("termination of build scroller");
}


function overScrollerItem(event:MouseEvent):void
{
     //trace("over" + event.currentTarget.title);
   var my_thumb:Loader = Loader(event.target);
     my_thumb.alpha = 0.5;
}
function outScrollerItem(event:MouseEvent):void
{
     //trace("out" + event.currentTarget.title);
   var my_thumb:Loader = Loader(event.target);
     my_thumb.alpha = 1;
}
function clickScrollerItem(event:MouseEvent):void
{
     trace("clicked item " + event.currentTarget.itemNum + " - visit url: " + event.currentTarget.link);
     try
     {
        imageLoader = new Loader();
        imageLoader.load(new URLRequest(event.currentTarget.link));
        imageLoader.x = 20;
        imageLoader.y = 140;
     addChild(imageLoader);
     }
     catch (event:Error)
     {
        // handle error here
      trace(event);
     }
}
function completeHandler(event:Event):void
{
     
     trace (gvar.glva.wsg);
     //trace("thumbnail complete " + e.target.loader.parent.parent.name);
   //size image into scroller
   resizeMe(event.target.loader.parent, 100, 100, false, true, true);
     Tweener.addTween(event.target.loader.parent.parent, { alpha:1, time: .5 } );
}
function errorHandler(event:IOErrorEvent):void
{
     trace("thumbnail error=" + event);
}

function resizeMe(mc:DisplayObject, maxW:Number, maxH:Number, constrainProportions:Boolean=false, centerHor:Boolean=true, centerVert:Boolean=true):void
{
     
     mc.width = maxW;
     mc.height = maxH;
     if (constrainProportions)
     {
        mc.scaleX < mc.scaleY ? mc.scaleY = mc.scaleX : mc.scaleX = mc.scaleY;
     }
     if (centerHor)
     {
        mc.x = (maxW - mc.width) / 2;
     }
     if (centerVert)
     {
        mc.y = (maxH - mc.height) / 2;
     }
}

function moveScrollerThumbs(event:Event):void
{
     if ( mouseY > scroller.y && mouseY < scroller.y + scroller.height)
     {//vertically over scroller
      if (mouseX < stage.stageWidth / 2 - padding * 2 && mouseX > 0)
        {//left of stage explicitly
         speed = -(mouseX - (stage.stageWidth / 2 - padding * 2)) / 8;
        }
        else if (mouseX > stage.stageWidth / 2 + padding * 2 && mouseX < stage.stageWidth)
        {//right of stage explicitly
         speed = -(mouseX - (stage.stageWidth / 2 + padding * 2)) / 8;
        }
        else
        {
           speed = 0;
        }
        scroller.x += speed;
 
        //scroller limits
      if (scroller.x < - scroller.width + stage.stageWidth - padding)
        {//if scrolled too far left
         scroller.x = - scroller.width + stage.stageWidth - padding;
        }
        else if (scroller.x > padding)
        {//if scrolled to far right
         scroller.x = padding;
        }
     }
}


DANKE
lg
Patrick
Geändert von fotofoto am 28.03.11 um 08:34 Uhr
Werbung
Beiträge: 0
Registriert: Feb 2016


RustyCake#2
Benutzerbild von RustyCake
Beiträge: 1776
Wohnort: Laimbach 6 1/2
Registriert: Nov 2002

28.03.2011, 10:40

Kann man annehmen, das jedes Image eine eigne breite hat?
Bitte keine Fragen, zu Flash per PM. Dazu ist das Forum da. Danke MFG_RustyCake!
"Wer tanzen will, muss erst gehen lernen"
fotofoto#3
Benutzerbild von fotofoto
Beiträge: 22
Registriert: Mar 2011

Themenautor/in

28.03.2011, 10:53

Jein alle Hochformat haben die selbe Breite und alle Querformat haben die selbe Breite also
2 verschiedene Breiten angaben. (Sonst würrde auch die Scrollfunktion durcheinander kommen).

Da aber hoch quer gemischt sein können wollte ich die Breite über xml mitgeben theoretisch
würde auch reichen wenn man ein h oder q für hoch oder quer mit gibt aber da ich die Werte so und so übergeben muss dachte ich mir warum dann nicht gleich den wert für die tatsächliche breite.
tobi-848#4
Benutzerbild von tobi-848
Beiträge: 43
Wohnort: Schweiz
Registriert: Oct 2010

28.03.2011, 11:11

Wieso speicherst du die Breite des Bildes nicht in Array ab. Du kannst dann per Index darauf zugreifen.

Freundliche Grüsse
Werbung
Beiträge: 0
Registriert: Feb 2016


fotofoto#5
Benutzerbild von fotofoto
Beiträge: 22
Registriert: Mar 2011

Themenautor/in

28.03.2011, 12:06

Also die Breiten in ein Array speichern sollte ja nicht das Problem sein nur wie greife
ich dann an den betreffenden punkten auf den richtigen wert zu ?

So wie ich das verstanden hab (kann mich auch irren) loopt das Script zuerst
durch alle xml einträge und übergibt das ganze dann den loader sonst wär ich ja mit meiner
Variable lösung auch zum Ziel gekommen da der wert ja bei jeden loop neu geladen wird sprich es wäre der richtige Wert vorhanden.

Wenn ich das ganze jetzt in ein Array speicher hätte ich zwar die werte aber an den betreffenden stellen keinen Anhaltspunkt welcher Array wert jetzt zu dem Bild gehört.

Wie gesagt bin neu in AS und vielleicht versteh ich da irgend was fallsch ..
RustyCake#6
Benutzerbild von RustyCake
Beiträge: 1776
Wohnort: Laimbach 6 1/2
Registriert: Nov 2002

28.03.2011, 12:13

Genauso wie Du "link" und "src" speicherst, kannst Du eine Array-ID oder gleich den Wert auf thisOne speichern.
Bitte keine Fragen, zu Flash per PM. Dazu ist das Forum da. Danke MFG_RustyCake!
"Wer tanzen will, muss erst gehen lernen"
tobi-848#7
Benutzerbild von tobi-848
Beiträge: 43
Wohnort: Schweiz
Registriert: Oct 2010

28.03.2011, 12:34

Hier sollte alles stehen:

http://livedocs.adobe.com/flash/9.0_de/ActionScriptLangRefV3/Array.html

Array initialisieren
ActionScript:
1private var arr:Array = new Array()


Array füllen
ActionScript:
1
2
3
for(var i:int=0;i<20<i++) {
  this.arr[i] = "Eintrag "+i;
}


Array ausgeben
ActionScript:
1
2
3
for(var i:int=0;i<20<i++) {
  trace(this.arr[i]);
}
fotofoto#8
Benutzerbild von fotofoto
Beiträge: 22
Registriert: Mar 2011

Themenautor/in

29.03.2011, 07:31

Danke für eure Hilfe !

Scheinbar bin ich zu blöd dafür oder seh den Wald vor lauter Bäumen nicht ...

@Rusty
Ich hab den wert ws also die Breite an thisOne übergeben also:

Zeile 91: thisOne.ws = ws;

und ruf sie mir in der completeHandler Funktion wieder auf (zum test mit trace)

Zeile 147: trace (thisOne.ws);

Da bekomm ich den Fehler 1120 Zugriff auf eine nicht definierte Eigenschaft thisOne

Auch wenn ich thisOne.ws in der Zeile 150 bei resizeme statt den ersten 100 wert eingebe
bekomm ich den selben fehler.

Was meiner Meinung nach daran liegt das thisOne ja nicht global ist (gibt es ja nicht mehr) daher nur in der Funktion buildScroller aber nicht in der Funktion completeHandler zu verfügung steht.


@tobi-848

Das mit dem Array hab ich schon verstanden nur hab ich da das gleiche Problem
wie mit thisOne.

Innerhalb der Funktion buildScroller funktioniert es problemlos bzw. kann ich es mir
auch sparen da durch das auslesen so und so durch die xml daten geloopt wird somit
würde ja auch die Variable reichen zb. ws = imageList[i].attribute("w");.

Zweiter ansatz mir dem Array war das ich aus der globalen Variable also über import
und einer .as Datei was mich leider auch nicht weiter bringt da der index vom xml loop ja nicht
in der funktion completeHandler zu verfügung steht ...

Wie gesagt seh sicher nur den Wald vor Bäumen nicht ... :-(

lg
Patrick
RustyCake#9
Benutzerbild von RustyCake
Beiträge: 1776
Wohnort: Laimbach 6 1/2
Registriert: Nov 2002

29.03.2011, 09:32

Auf 91 steht so was nicht.
Nur das weiter oben.
ActionScript:
1
2
3
4
5
                var ws:Number;
        ws = imageList[i].attribute("w");
        //Globale Variable ws für Breite vergeben
      gvar.glva.wsg = ws
        trace (gvar.glva.wsg);
Bitte keine Fragen, zu Flash per PM. Dazu ist das Forum da. Danke MFG_RustyCake!
"Wer tanzen will, muss erst gehen lernen"
fotofoto#10
Benutzerbild von fotofoto
Beiträge: 22
Registriert: Mar 2011

Themenautor/in

29.03.2011, 10:03

Ja genau das ist ja das Problem :-(

Der Wert ws also ws = imageList[i].attribute("w"); gibt die Breite des Bildes an.

Dieser sollte an folgenden 2 Punkten eingefügt werden:

Zeile 134 bei imageLoader.y = 140; statt dem 140.

Zeile 150 beim Aufruf der Funktion resizeMe statt dem ersten 100 wert.

Mein erster Lösungsansatz war den ws wert über import quasi global zu machen.

Also eine .as Datei gvar.as im Ordner Global mit folgenden Inhalt:
ActionScript:
1
2
3
4
5
package global {
  public class gvar {
  public static var glva:Object = {};
  }
}


Damit kann ich mit gvar.glva.wsg = ws  den wert in die so zusagen globale
Variable übergeben und mit an den entsprechenden Punkten mit
trace (gvar.glva.wsg) oder nur mit gvar.glva.wsg wenn ich den Wert ersetzen will zurück holen.

Das Problem dabei ist (zumindest vermute ich das) das zuerst durch alle xml Einträge geloop
diese zwischen gespeichert werden und dann gesamt über den Loader übergeben werden und
nicht die Funktionen (completeHandler) im zuge das durchloopens der xml Daten aufgerufen werden.

Ja und genau da liegt dann das Problem da ich so bei allen Bildern immer nur den Wert für die Breite das letzten Bildes bekomme also alle zb. 100

Also innerhalb der Funktion buildScroller bekomm ich die richtigen Werte zb.
100
100
67
100
67
100
usw.

Bei den stellen wo ich es dann Einfügen will bekomm ich mit trace dann nur noch:
100
100
100
100
100
100

lg
Patrick
RustyCake#11
Benutzerbild von RustyCake
Beiträge: 1776
Wohnort: Laimbach 6 1/2
Registriert: Nov 2002

29.03.2011, 10:53

Ich meinte das eher so:
ActionScript:
1thisOne.wsID = Number(imageList[i].attribute("w"));

Zugriff dann:
ActionScript:
1event.currentTarget.wsID;


Oder ich versteh hier was falsch.
Bitte keine Fragen, zu Flash per PM. Dazu ist das Forum da. Danke MFG_RustyCake!
"Wer tanzen will, muss erst gehen lernen"
Purgar#12
Benutzerbild von Purgar
Beiträge: 151
Registriert: May 2010

29.03.2011, 11:11

du hast doch eine gewisse Breite für das Hochformat und das Querformat. Die scheinen ja alle gleich breit zu sein in ihrem Format. Mach doch eine if-Abfrage im completeHandler.
Wenn die Bilder die Breite des Hochformats haben, Positon x = so und so..wenn die Bilder aber die Breites des Querformats haben, positon x = so und so...
sodass, egal ob Hoch oder Querformat, immer der gleiche Abstand zwischen den Bildern herrscht..
oder habe ich das auch falsch verstanden?
fotofoto#13
Benutzerbild von fotofoto
Beiträge: 22
Registriert: Mar 2011

Themenautor/in

29.03.2011, 12:07

DANKE dir !

Jetzt kapier ich das schön langsam bzw weiß das ich falsch um die Ecke gedacht hab :-)

So was ähnliches hab ich mir gedacht nur den richtigen syntax finden ...

Ist ja auch logisch thisOne ist das target von der Funktion clickScrollerItem
so übergebe ich mir thisOne ein Objekt wsID was ein Array aus Index und den
Breitenangaben enthält.

Durch event.currentTarget zeig ich dann auf das aktuelle Ziel also in dem fall thisOne
und mit .wsID bekomm ich den wert mit der aktuellen index Nummer.

Hoff ich hab das richtig verstanden ?

Somit ist der eine Wert in Zeile 134 erledigt.

In der Funktion compleateHandler bekomm ich noch folgenden Fehler:
1069: Eigenschaft wsID für flash.display.LoaderInfo nicht gefunden

Daraus schließe ich mal das das Target für die Funktion compleateHandler
flash.display.LoaderInfo ist.

Hab mal versucht  flash.display.LoaderInfo die wsID mitzugeben also:
flash.display.LoaderInfo.wsID = Number(imageList ... etc.

Das geht aber nicht kann ich überhaupt den Loader ein selbst geschnitztes Objekt mitgeben ...

@ Purgar
Ja so in der Richtung soll es ja laufen nur habe ich in der Funktion compleateHandler nirgend wo
den aktuellen Breitenwert um ihn mit if zu vergleichen (da will ich ja hin) im original script
sind die werte mit 100x100 ja fix vorgegeben.

lg
Patrick
Purgar#14
Benutzerbild von Purgar
Beiträge: 151
Registriert: May 2010

29.03.2011, 13:09

ich frage mich gerade, ob ich überhaupt eine childnode in der xml einbauen muss, der mir die größe des bildes übergibt?!? das muss ich gleich, wenn ich  zeit habe mal testen..denn meines erachtens nach kann man sich doch der größe des geladenen bilder ausgeben lassen oder nicht? du kannst dir doch im completeHandler von jedem "thumbnail" was du in deinen scroller reinlädst , die größe ausgeben lassen..daher kannst du diese werte doch auch in einer if abfrage anwenden...

versuch mal einen trace im completeHandler

ActionScript:
1trace("thumbnail width"+e.currentTarget.loader.parent.width);
Geändert von Purgar am 29.03.11 um 13:10 Uhr
RustyCake#15
Benutzerbild von RustyCake
Beiträge: 1776
Wohnort: Laimbach 6 1/2
Registriert: Nov 2002

29.03.2011, 13:32

Das target ist "var thisOne:MovieClip = new MovieClip();"
Bitte keine Fragen, zu Flash per PM. Dazu ist das Forum da. Danke MFG_RustyCake!
"Wer tanzen will, muss erst gehen lernen"
fotofoto#16
Benutzerbild von fotofoto
Beiträge: 22
Registriert: Mar 2011

Themenautor/in

29.03.2011, 14:46

@ Purgar
Danke daran hab ich überhaupt nicht gedacht ...

Wie anfangs erwähnt kenn mich zwar in anderen sprachen aus aber as ist für mich relativ neu ...

Ja funktioniert so weit einwandfrei jedoch mit event.currentTarget.width da ich ja schon im loader bin.

Die Breitenangabe in der xml Datei werd ich mir nicht ganz sparen können
da in der Zeile 73 mit  thisOne.x = (100 + 20) * i die Abstände zwischen
den Bildern in der Leiste geregelt werden zu dem Zeitpunkt ist aber noch nichts
in den loader geladen worden somit kann ich es auch nicht abfragen.
(Es sei denn ich seh wieder mal was falsch ... )

@ RustyCake

Versteh ich jetzt nicht wenn das Target von completeHandler auf thisOne ist
müsste ich eigentlich mit event.currentTarget.wsID die Breite auslesen können was ja
nicht funktioniert hat. Fehermeldung 1069: Eigenschaft wsID für flash.display.LoaderInfo nicht gefunden

Somit denk ich mal das ich da auf flash.display.LoaderInfo und nicht auf thisOne bin .... ?


Allgemein einmal einen HERZLICHEN DANK an euch für das geduldige fragen beantworten und weiter
helfen !!!!

Das Problem wäre eigentlich gelöst bei 2 Werten gehe ich jetzt über RustyCakes
lösung und im completeHandler frage ich die breite direkt über den loader wie
von Purgar vorgeschlagen ab.

Also es funktioniert :-) schöner wäre es wenn alles aus einer Quelle kommen würde aber
bin schon froh das es mal läuft ... *g*

DANKE

lg
Patrick

AntwortenRegistrieren Seite1 2  

Schnellantwort

Du musst registriert sein, um diese Funktion nutzen zu können.

 
Ähnliche Beiträge zum Thema
Partner Webseiten: art-and-law.de  Mediengestalter.info   php-resource.de   phpforum.de   phpwelt.de   Pixelio.de   Scubacube.de  
Haftungsausschluss   Datenschutzerklärung   Hier Werben   Impressum
© 1999-2020 Sebastian Wichmann - Flashhilfe.de