flash笔记之解决TileList滚屏里面的值错位情况

    技术2022-05-19  26

    使用TileList控件的时候,如果使用自定义itemRenderer的时候,经常在移动滚动条时发生

    图像丢失的显现。这是TileList控件本身存在的BUG。我们要做的是在滚动条发生事件或者data发生变化的时候

    帮助flash强制刷新一次就可以了。scroll="event.currentTarget.offscreenExtraRowsOrColumns=Math.ceil

    其实大家弄的太麻烦了,TileList控件本身不存在的BUG。只要是对象就可以。直接上图。<?xml version="1.0" encoding="utf-8"?> <s:WindowedApplication xmlns:fx="http://ns.adobe.com/mxml/2009" xmlns:s="library://ns.adobe.com/flex/spark" xmlns:mx="library://ns.adobe.com/flex/mx" initialize="init()" width="800" height="600" title="资源编辑器"> <fx:Declarations> <!-- Place non-visual elements (e.g., services, value objects) here --> </fx:Declarations> <fx:Script> <!--[CDATA[ import core.ImageLoader; import core.LogicDataManager; import mx.graphics.codec.IImageEncoder; import mx.graphics.codec.JPEGEncoder; import mx.graphics.codec.PNGEncoder; import resouceEvent.GameEvent; import resouceEvent.ResouceEventDispatcher; private var select_file:File = null; private var resources:Array = null; private function init():void { this.nativeWindow.maximize(); // fileTree.selectedItem = File.desktopDirectory; fileTree.directory = File.desktopDirectory; ResouceEventDispatcher.addEventListener(ResouceEventDispatcher.NUMERICSTEPPER_COMPLETE, onRolePetAutoHandler); } private var numericStepper:spark.components.NumericStepper; private function onRolePetAutoHandler(e:resouceEvent.GameEvent):void{ numericStepper = spark.components.NumericStepper(e.data) // trace(numericStepper.value); trace(numericStepper.name); var _name:int = int(numericStepper.name); var arr:Array = resources; for(var i:int=0;i<resources.length;i++){ var loader:ImageLoader = resources[i] as ImageLoader; if(loader){ if(_name==loader.file_index){ loader.framespeed = numericStepper.value; } } } } protected function fileTree_directoryChangeHandler(event:Event):void { select_file = fileTree.selectedItem as File; } private var count:int; private function loaderFiles():void{ var files:Array = select_file.getDirectoryListing(); resources = new Array(files.length); count = files.length; var index:int = 0; for each(var file:File in files){ if(file.extension.toUpperCase() == "PNG"){ var loader:ImageLoader = new ImageLoader(); loader.file_name = file.name; loader.file_index = index; loader.file_extension = file.extension; loader.nativePath =file.nativePath; loader.framespeed = 6; loader.contentLoaderInfo.addEventListener(Event.COMPLETE,onComplete); loader.load(new URLRequest(file.nativePath)); index++; } } frame_num.text = index/8+""; } private function onComplete(e:Event):void{ var loader:ImageLoader = e.target.loader as ImageLoader; loader.bmd = Bitmap(loader.content).bitmapData; //resources[loader.file_index] = loader; LogicDataManager.getInstance().resources[loader.file_index] =loader; count--; if(count==1){ resource_tile.dataProvider = LogicDataManager.getInstance().resources; } } private function show_clickHandler(event:MouseEvent):void{ // trace(select_file.isDirectory); if(select_file != null && select_file.isDirectory){ loaderFiles(); } } private var maskColor:uint=0xFF000000; private var color:uint=0x00000000; private var redBounds:Rectangle; private var nb:BitmapData; protected function button_clickHandler(event:MouseEvent):void { var directory:File = File.desktopDirectory.resolvePath(select_file.name+"_handler"); if(directory.exists){ try{ for each(var file:File in directory.getDirectoryListing()){ file.deleteFile(); } directory.deleteFile(); }catch(e:Error){ trace(e.message); } } directory.createDirectory(); var role_xml:XML = <{this.job.selectedItem.value}></{this.job.selectedItem.value}>; var sex_xml:XML = <{this.sex.selectedItem.value}></{this.sex.selectedItem.value}>; var action_xml:XML = <{this.action.selectedItem.value}></{this.action.selectedItem.value}>; sex_xml.appendChild(action_xml); role_xml.appendChild(sex_xml); // var frame:int = int(frame_num.text); var bm:BitmapData = null; for each(var loader:ImageLoader in resources){ // trace(loader.file_name); bm = loader.bmd; redBounds = bm.getColorBoundsRect(maskColor, color, false); var encoder:IImageEncoder = null; if(loader.file_extension.toLocaleUpperCase() == "JPG"){ encoder = new JPEGEncoder(); nb = new BitmapData(redBounds.width,redBounds.height,false); }else if(loader.file_extension.toLocaleUpperCase() == "PNG"){ encoder = new PNGEncoder(); nb = new BitmapData(redBounds.width,redBounds.height,true,0x00000000); } nb.copyPixels(bm, redBounds, new Point(0,0)); trace("原图:"+bm.width+","+bm.height); trace("拷贝图:"+nb.width+","+nb.height); trace("偏移:"+redBounds.left+","+redBounds.top); // var buf:ByteArray = nb.getPixels(nb.rect); // buf.position = 0; var frame_xml:XML = <{"f"+loader.file_index}/>; // var frame_xml:XML = <f{loader.file_index}></f{loader.file_index}>; // frame_xml.appendChild(<f{loader.file_index}/>); frame_xml.appendChild(<x>{redBounds.left}</x>); frame_xml.appendChild(<y>{redBounds.top}</y>); action_xml.appendChild(frame_xml); var new_file:File=directory.resolvePath(loader.file_name); var fileSteam:FileStream=new FileStream(); fileSteam.open(new_file, FileMode.WRITE); fileSteam.writeBytes(encoder.encode(nb)); fileSteam.close(); } var fileName:String = this.sex.selectedItem.value + "_" + this.job.selectedItem.value + "_" + this.action.selectedItem.value + ".xml"; new_file=directory.resolvePath(fileName); fileSteam=new FileStream(); fileSteam.open(new_file, FileMode.WRITE); fileSteam.writeUTFBytes(role_xml.toXMLString()); // fileSteam.writeMultiByte(role_xml.toXMLString(),"utf8"); fileSteam.close(); trace("complete"+new_file); } ]]> </fx:Script> <mx:HBox width="100%" height="100%" x="30" y="30"> <mx:FileSystemTree id="fileTree" x="30" y="30" height="600" width="250" showHidden="true" extensions="['.jpg', '.png']" change="fileTree_directoryChangeHandler(event)"/> <mx:Canvas width="100%" height="100%" borderColor="0xcccccc"> <mx:TileList id="resource_tile" dragEnabled="true" width="100%" height="100%" columnCount="2" rowCount="2"> <mx:itemRenderer> <fx:Component> <mx:VBox> <fx:Script> <![CDATA[ import core.ImageLoader; import core.LogicDataManager; import resouceEvent.GameEvent; import resouceEvent.ResouceEventDispatcher; protected function numericstepper1_clickHandler(e:Event):void { var _numericStepper:spark.components.NumericStepper = e.target as spark.components.NumericStepper; _numericStepper.name=e.target.name var myLoader:ImageLoader = ImageLoader(LogicDataManager.getInstance().resources[data.file_index]); myLoader.framespeed = _numericStepper.value; } ]]--> </fx:Script> <s:NumericStepper minimum="10" maximum="60" stepSize="2" value="{data.framespeed}" change="numericstepper1_clickHandler(event)"/> <mx:Image source="{data.nativePath}" width="100%" height="100%"/> </mx:VBox> </fx:Component> </mx:itemRenderer> </mx:TileList> </mx:Canvas> </mx:HBox> <mx:HBox> <s:Button label="save" click="button_clickHandler(event)"/> <s:Button label="show" click="show_clickHandler(event)"/> <s:ComboBox id="sex" labelField="label" selectedIndex="0"> <s:ArrayList> <fx:Object label="男" value="boy"/> <fx:Object label="女" value="girl"/> </s:ArrayList> </s:ComboBox> <mx:ComboBox id="action" labelField="label" selectedIndex="0"> <s:ArrayList> <fx:Object label="站立" value="stand"/> <fx:Object label="行走" value="walk"/> <fx:Object label="攻击" value="attack"/> <fx:Object label="施法" value="magic"/> <fx:Object label="受伤" value="hurt"/> <fx:Object label="死亡" value="dead"/> </s:ArrayList> </mx:ComboBox> <mx:ComboBox id="job" labelField="label" selectedIndex="0"> <s:ArrayList> <fx:Object label="战士" value="zhanshi"/> <fx:Object label="法师" value="fashi"/> <fx:Object label="牧师" value="mushi"/> </s:ArrayList> </mx:ComboBox> <s:Label text="FrameNum"/> <s:TextInput id="frame_num"/> </mx:HBox> </s:WindowedApplication>


    最新回复(0)