Edward,

Was this in response to my thread? I don't follow.

On Tue, Sep 2, 2008 at 8:07 PM, Edward Rockwell <[EMAIL PROTECTED]>wrote:

>
> My scenario was loading images from a directory on the server and placing
> them inside a canvas in a rectangular array fashion.  When I set autoLayout
> to
> true the images would show without me sizing the canvas to the height/width
> of the total contents, but when I set autoLayout to false, I had to set the
> total
> height/width of the canvas to match it's contents.  I thought it was
> strange.
> I read in blog somewhere that easing would not work correctly on moving a
> canvas that had autoLayout set to true.. I was finding that to be the case,
> so
> that's why I set autoLayout to false.
>
>
> On Tue, Sep 2, 2008 at 7:43 PM, Richard Rodseth <[EMAIL PROTECTED]>wrote:
>
>>   I'd really love some review of the code below. I made one correction in
>> red: the target of the move() call should be "this" rather than _content.
>>
>> Some refactoring might be in order. The dance between the contentholder
>> and the ScaledContent parent due to the  _allowInvalidateSize issue is a bit
>> clunky.
>>
>> But my  main concern now is that while it scales and centers as desired,
>> it only does it if the contents have an explicit width and height. Not sure
>> if that calls into question the whole approach, or is just a missing
>> invalidation.
>>
>> Thanks.
>>
>> On Tue, Sep 2, 2008 at 11:59 AM, Richard Rodseth <[EMAIL PROTECTED]>wrote:
>>
>>> I'm returning to a component I was trying to write earlier, that would
>>> scale and center a single child (or ideally children), such that the
>>> contents fit within the bounds of the container, and aspect ratio is
>>> preserved. The solution at the end of this post  does the scaling of one
>>> child fine (including aspect ratio) but I haven't figured out how to
>>> incorporate the centering. Just setting horizontalCenter on the content
>>> holder didn't work, and nor did my efforts to add a move() call as shown in
>>> the code below:
>>>
>>> A couple of notes.
>>> - If the measure() implementations returned content dimensions rather
>>> than 0, I got scroll bars and 1400 was passed into updateDisplayList().
>>> - allowInvalidateSize is because otherwise setting scale triggers
>>> re-measuring.
>>>
>>> Any advice about the centering would be much appreciated. Here's the
>>> code:
>>>
>>> Test case:
>>>
>>> <mx:Canvas width="90%" height="90%" horizontalCenter="0"
>>> verticalCenter="0" borderStyle="solid" >
>>>     <comp:ScaledContent  width="100%" height="100%" borderStyle="solid" >
>>>         <mx:Button label="Big" width="1400" height="1400"
>>> cornerRadius="50"/>
>>>      </comp:ScaledContent>
>>> </mx:Canvas>
>>>
>>> ScaledContent.mxml:
>>>
>>> <?xml version="1.0" encoding="utf-8"?>
>>> <mx:Canvas xmlns:mx="http://www.adobe.com/2006/mxml"; xmlns:comp="comp.*"
>>>     horizontalScrollPolicy="off" verticalScrollPolicy="off"
>>>     >
>>>
>>>     <mx:Metadata>
>>>         [DefaultProperty("contents")]
>>>
>>>     </mx:Metadata>
>>>
>>>     <mx:Script>
>>>         <![CDATA[
>>>             import mx.core.UIComponent;
>>>
>>>             private var _contents:UIComponent;
>>>             private var _contentsChanged:Boolean = false;
>>>
>>>             public function set contents(value:UIComponent):void {
>>>                 _contents = value;
>>>                 _contentsChanged = true;
>>>                 this.invalidateProperties();
>>>             }
>>>
>>>             override protected function commitProperties():void {
>>>                 super.commitProperties();
>>>
>>>                 if (_contentsChanged) {
>>>                     contentHolder.content = _contents;
>>>                     _contentsChanged = false;
>>>                 }
>>>              }
>>>
>>>
>>>             override protected function measure():void {
>>>                 super.measure();
>>>                 minWidth = measuredWidth = 0; //
>>> _contents.getExplicitOrMeasuredWidth();
>>>                 minHeight = measuredHeight = 0; //
>>> _contents.getExplicitOrMeasuredHeight();
>>>             }
>>>
>>>             override protected function
>>> updateDisplayList(unscaledWidth:Number, unscaledHeight:Number):void {
>>>                 super.updateDisplayList(unscaledWidth, unscaledHeight);
>>>                 contentHolder.scaleContentToFit(unscaledWidth,
>>> unscaledHeight);
>>>                 contentHolder.setActualSize(unscaledWidth,
>>> unscaledHeight);
>>>             }
>>>         ]]>
>>>     </mx:Script>
>>>
>>>     <comp:ScaledContentHolder id="contentHolder" >
>>>     </comp:ScaledContentHolder>
>>>
>>> </mx:Canvas>
>>>
>>> ScaledContentHolder.as
>>>
>>>     public class ScaledContentHolder extends UIComponent
>>>     {
>>>         public function ScaledContentHolder()
>>>         {
>>>         }
>>>
>>>         private var _allowInvalidateSize:Boolean = true;
>>>         private var _content:UIComponent;
>>>         private var _contentChanged:Boolean = false;
>>>
>>>         override protected function measure():void
>>>         {
>>>             super.measure();
>>>             minWidth = measuredWidth = 0; //
>>> _content.getExplicitOrMeasuredWidth();
>>>             minHeight = measuredHeight = 0;
>>> //_content.getExplicitOrMeasuredHeight();
>>>         }
>>>
>>>         public function set content(value:UIComponent):void {
>>>             _content = value;
>>>             _contentChanged = true;
>>>             this.invalidateProperties();
>>>         }
>>>
>>>          override protected function commitProperties():void {
>>>              super.commitProperties();
>>>              if (_contentChanged) {
>>>                  this.removeAllChildren();
>>>                  this.addChild(_content);
>>>                  _contentChanged = false;
>>>              }
>>>          }
>>>
>>>
>>>       private function removeAllChildren():void
>>>       {
>>>           while (numChildren> 0)
>>>           {
>>>               removeChildAt(0);
>>>           }
>>>       }
>>>
>>>
>>>         override public function invalidateSize():void
>>>         {
>>>             if (_allowInvalidateSize)
>>>                 super.invalidateSize();
>>>         }
>>>
>>>         public function scaleContentToFit(unscaledWidth:Number,
>>> unscaledHeight:Number):void {
>>>             var contentWidth:Number =
>>> _content.getExplicitOrMeasuredWidth();
>>>             var contentHeight:Number =
>>> _content.getExplicitOrMeasuredHeight();
>>>
>>>             var xScale:Number = (unscaledWidth / contentWidth);
>>>             var yScale:Number = (unscaledHeight / contentHeight);
>>>             var finalScale:Number = Math.min(xScale, yScale); // Preserve
>>> aspect ratio
>>>
>>>             _allowInvalidateSize = false;
>>>             this.scaleX = finalScale;
>>>             this.scaleY = finalScale;
>>>              _allowInvalidateSize = true;
>>>
>>>              var scaledContentWidth:Number = contentWidth * finalScale;
>>>              var scaledContentHeight:Number = contentHeight * finalScale;
>>>
>>>              this.move(unscaledWidth/2 - scaledContentWidth/2 ,
>>> unscaledHeight/2 - scaledContentHeight/2);
>>>
>>>         }
>>>
>>>         override protected function
>>> updateDisplayList(unscaledWidth:Number, unscaledHeight:Number):void
>>>         {
>>>             super.updateDisplayList(unscaledWidth, unscaledHeight);
>>>         }
>>>
>>>
>>
>
>
> --
> Jamie
>  
>

Reply via email to