EXECUTIVE SUMMARY: Is it possible to change the content of grouped items that resides in the library only (not on the main timeline) with JSFL
Hej Alle, Jeg prøver på at lave en funktion der ændrer properties på samtlige tekstfelter i en film (library og hovedscene) Det fungerer fint, med mindre man har en eller flere tekstfelter i grupper... så vidt jeg kan se er der ikke nogen måde at få fat på indholdet af grupper via JSAPI'en.
Antag at jeg har en frame i en tidslinje. Jeg vil nu gerne finde samtlige tekstfelter og ændre deres tekst denne frame: ------------- BEGIN CODE ---------------- var e = frame.elements.length; while ( e-- ) { var element = frame.elements[ e ]; if ( element.isGroup ) { // HVORDAN FÅR MAN FAT I GRUPPENS "MEDLEMMER"? } else if ( element.elementType == "text" ) { element.setTextString( "Flash virker 90% - hver gang." ); } } ------------------ END OF CODE ---------
Et element kan enten være "shape", "text", "instance", eller "shapeObj". Hvis det er "text" er alt fint. Hvis det er "instance", kan jeg få fat i dets tidslinje og finde nye elementer dér. Hvis det er en gruppe har det typen "shape" og en property der hedder isGroup, jvf. koden ovenfor. Shapes der er grupper har tilsyneladende ikke nogen properties eller metoder til at få fat i det grupperede indhold.
En langt ude workaround er at løbe samtlige frames i hovedtidslinjen igennem depth-first, af-gruppere alle grupper, undersøge deres indhold, checke for om der er tekstfelter, ændre properties, regruppere igen. Men det kan tilsyneladende kun lade sig gøre for elementer der er på hovedscenen (f.eks ikke linkede objekter)
Spm 1. er rigtigt forstået. Spm 2. skulle være: Hvordan unGroup'er man grupper der kun eksisterer i et clip i library.
Vedhæftet lidt eksempelkode som kan hjælpe i undersøgelsen m.m. kopier den ind i en tom .jsfl fil og dobbeltklik på den, så får du (næsten) al tekst i de åbne dokumenter i flash skrevet ud.
// Public variables to trace. var document; var timeline; var symbolName;
// ---------------- MAIN PROGRAM ------------------ parseOpenDocuments( displayTextFieldTextInFrame );
// ------------ FUNCTION DECLARATIONS ------------- function parseOpenDocuments( refFunction, argsArray ) { // Parse all open documents in flash for (var k = 0; k<fl.documents.length; k++ ){ document = fl.documents[k]; // trace( "----------------\n"+document.name+"\n---------------" ); parseDocumentElements( document, refFunction, argsArray );
// Publish the document // document.publish(); } }
function parseDocumentElements( document, refFunction, argsArray ) { // Parse main stage timeline as it is not in the library runFunctionOnTimelineKeyframes( document.getTimeline(), refFunction, argsArray );
// Parse library var items = document.library.items; var i = items.length; while(i--) { var item = items[i]; // Dont look at folders or sounds/images if ( item.timeline != undefined ) { // trace("Symbol = "+item.name ); symbolName = item.name; timeline = item.timeline; runFunctionOnTimelineKeyframes( item.timeline, refFunction, argsArray ); } } }
function runFunctionOnTimelineKeyframes( timeline, refFunction, argsArray ) { // Loop through all layers var l = timeline.layerCount; while( l-- ) { var f = 0; // Parse all keyframes in the timeline and skip the others while ( f<timeline.layers[ l ].frameCount ) { // trace("Layer "+(l+1)+" frame "+(f+1)); frame = timeline.layers[ l ].frames[ f ]; refFunction( frame, argsArray ); f += frame.duration; }
}
}
// --------------------------- HELPER FUNCTIONS ------------------------- function dump( prefix, o ) { for (var i in o ) { trace( prefix + i + "="+o[i] ); dump( prefix+i+".", o[i] ); } }
function trace(str) { fl.outputPanel.trace( str ); }
// ---------------- USER DEFINED FUNCTIONS ---------------- // Parse the contents of a single frame // Definition: function myfunction( frame:Frame, args:Array ):Void { ... } // Call: parseOpenDocuments( myFunction, args );
function displayTextFieldTextInFrame( frame, argsArray ) { var e = frame.elements.length; while ( e-- ) { var element = frame.elements[ e ]; if ( element.elementType == "text" ) { trace( "Symbol: "+symbolName+"\n Text="+element.getTextString() ); } else if ( element.elementType == "shape" && element.isGroup ) { trace("Found a group. Don't know what to do with it"); } } }
function displayFrameActionScript( frame, argsArray ) { if ( frame.actionScript!=undefined && frame.actionScript != "" ) trace( frame.actionScript ); } ------------ END OF CODE ------------
1) Man kan ikke få fat i en gruppes elementer. Eneste måde er at afgruppere og parse framen igen.
2) Der er en bug i isGroup. Den virker kun når man har selectet alle elementer i currentFrame før man spørger på den. Man tilgår et element i library'et sådan:
document.library.editSymbol( <name> );
og sætter pointers til den frame man vil editere i sådan:
Derefter kan man bruge document.selectAll() og document.unGroup()
Lidt kryptisk, jeg ved det, men jeg håber det kan være en hjælp for andre der arbejder med JSFL.
/Pål
Synes godt om
Ny brugerNybegynder
Din løsning...
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.