If you're doing all your own layout, don't waste time calling Canvas.measure()
-Josh On Thu, Jun 26, 2008 at 5:05 AM, Richard Rodseth <[EMAIL PROTECTED]> wrote: > I had the good fortune to spend some time with Alex last night and > show him my infamous TiledCanvas, now with renewed urgency since the > scroll bars don't appear on Windows under Firefox 3 or IE. We are > looking into some other issues in the wrapper that could affect > scrolling, but I want to get the custom component right anyway, and > Alex thought it could be the culprit. > > Alex, > > I have rewritten measure() so that it computes the tiled size, using > only the getExplicitOrMeasuredWidth/Height result for each child (+ > padding) to set measuredMinWidth/Height and measuredWidth/Height > I have rewritten updateDisplayList so that it does not alter > includeInLayout and calls setActualSize rather than setting width and > height > > - Neither method looks at any minimums or maximums, and I'm not clear > whether they should. > - measure() calls super.measure(), and I'm unclear whether it should > in this case (Canvas.measure is probably relatively expensive). > > The good news is that IF I leave in place the hierarchy below, and the > funky runtime switching of minimum sizes when a pod is zoomed, it > works as it did before. So at least I'm weaned off the completely > wrong-headed measure/udl implementations. > > However, this alone didn't solve the Windows problem, and if I remove > "podSurface" below and set the minimum on the TiledCanvas itself, I > get double scrollbars in some cases. If I use the TiledCanvas on its > own (setting both minimums and scroll policy auto), I don't get > scrollbars and it's clipped. > > Any further tips welcome, and thanks again for the help, Alex. I can > share the measure() method if that helps. > > I'm still puzzled how the framework uses the measure values and > whether they have any bearing on scroll extent, because it seems that > the measured size as I'm computing it (based on the "natural size" of > the pods) could be much larger than I would ever want to actually > scroll. > > <mx:Canvas id="scrollableArea" > width="100%" height="100%" > verticalScrollPolicy="auto" > horizontalScrollPolicy="auto"> > > <mx:Canvas id="podSurface" > width="100%" height="100%" > verticalScrollPolicy="off" > horizontalScrollPolicy="off" > minWidth="950" minHeight="600" > > > > <view:TiledCanvas3 id="tiledView" > verticalScrollPolicy="off" > horizontalScrollPolicy="off" > styleName="dashboardTiled" > width="100%" height="100%" /> > </mx:Canvas> > </mx:Canvas> > > On Sun, Jun 8, 2008 at 7:31 PM, Josh McDonald <[EMAIL PROTECTED]> wrote: > > It is because of another call to measure(), but that's not getting lucky, > > it's being scheduled when you change includeInLayout. > > > > -Josh > > > > On Mon, Jun 9, 2008 at 10:39 AM, Richard Rodseth <[EMAIL PROTECTED]> > wrote: > >> > >> I'm still somewhat confused, but have hacked up a workable solution as > >> follows: > >> > >> <mx:Canvas id="scrollableArea" width="100%" height="100%" > >> verticalScrollPolicy="auto" > >> horizontalScrollPolicy="auto"> > >> > >> <mx:Canvas id="podSurface" width="100%" height="100%" > >> verticalScrollPolicy="off" horizontalScrollPolicy="off" minWidth="950" > >> minHeight="600"> > >> <view:TiledCanvas2 id="tiledView" width="100%" height="100%" /> > >> </mx:Canvas> > >> </mx:Canvas> > >> > >> podSurface.minWidth and minHeight get changed dynamically when a pod > >> is expanded, and the scrollbars and scroll extent adjust > >> appropriately. > >> > >> Here's the interesting thing. TiledCanvas2 still uses the inherited > >> Canvas.measure(), but the updateDisplayList implementation now sets > >> includeInLayout to false for the hidden pods, in addition to setting > >> x,y,width,height and visible. Am I just getting lucky because of some > >> call to measure() that occurs after updateDisplayList() is called? > >> Also, maybe if I was calling setActualSize in UDL, my solution would > >> no longer work... > >> > >> The thing I have a hard time understanding is that the docs talk about > >> measure() as setting the "intrinsic" or "natural" size of the > >> component, but in a case like this, what is that? What concept tells > >> me that an appropriate implementation of measure would "estimate" the > >> tiling as Alex suggests but use measured sizes of children, when the > >> layout itself is determined by the component size, not vice versa. > >> > >> I should step through Canvas.measure and see what numbers it's coming > >> up with that affect what happens all way up the hierarchy, even > >> though the component's size is independent of the contents of each > >> pod. My head hurts. > >> > >> On Sat, Jun 7, 2008 at 11:36 PM, Richard Rodseth <[EMAIL PROTECTED]> > >> wrote: > >> > Thanks, Alex. That gives me a lot to mull over. > >> > Since the only use case of interest that doesn't work is the one where > >> > you'd like to specify a minimum size for the tiled view, it's an awful > >> > lot of extra work, but I'll think it over. > >> > If I can crack my other long-standing challenge (the ScaleOrCenterView > >> > of another thread), then I could probably get by with no scroll bars > >> > at all. > >> > > >> > Thanks again for the solution outline. > >> > > >> > On Sat, Jun 7, 2008 at 11:17 PM, Alex Harui <[EMAIL PROTECTED]> wrote: > >> >> Canvas's measure() probably expects all children to be visible or > >> >> excluded > >> >> via includeInLayout. Since I don't think that's what you want, you'll > >> >> need > >> >> to write your own measure method(). > >> >> > >> >> > >> >> > >> >> The measure() method should assume that all children are property > >> >> addChild'd > >> >> (and thus your charts shouldn't be unparented) and use the measured > >> >> sizes of > >> >> its children to calculate its measuredWidth/Height. It would probably > >> >> just > >> >> call getExplcitOrMeasuredWidth/Height on the children if > >> >> selectedChild==null > >> >> and estimate what the tile layout will look like, or if there is a > >> >> selectedChild, just measure that one child. > >> >> > >> >> > >> >> > >> >> Based on those measurements and any other constraints on your > >> >> component, its > >> >> parent will determine its size and your component's updateDisplayList > >> >> gets > >> >> called with that size. In your override of updateDL, you would see if > >> >> selectedChild==null and do the final sizing and positioning of the > >> >> children > >> >> and probably make all children visible, or if selectedChild is set, > >> >> make all > >> >> other children invisible and size and position that one child to fill > >> >> the > >> >> unscaledWidth/Height passed into updateDL. > >> >> > >> >> > >> >> > >> >> I would not remove and re-add children when selectedChild changes. It > >> >> would > >> >> likely cause more measuring and layout again. > >> >> > >> >> > >> >> > >> >> -Alex > >> >> > >> >> > >> >> > >> >> ________________________________ > >> >> > >> >> From: [email protected] [mailto:[EMAIL PROTECTED] > On > >> >> Behalf Of Richard Rodseth > >> >> Sent: Saturday, June 07, 2008 1:30 PM > >> >> To: [email protected] > >> >> Subject: Re: [flexcoders] Measurement and scrolling > >> >> > >> >> > >> >> > >> >> Thanks for indulging me, everyone. I wish I could share all the code > >> >> now - I certainly hope to later. I'm sorry to say I find that ESRIA > >> >> example quite inscrutable as sample code, though the UI is certainly > >> >> nice. > >> >> > >> >> So, to review where I am, I have a component that tiles its children > >> >> and resizes rather well (perhaps by accident). It derives from Canvas > >> >> (should possibly be UIComponent), and the updateDisplayList method > >> >> sets the x,y,width,height of the children (should possibly be calling > >> >> setActualSize, thought it currently doesn't assume that the children > >> >> are UIComponents, even though they are). The measure() method is > >> >> inherited from Canvas. > >> >> > >> >> When an individual pod is maximized, the contents of the display list > >> >> is not changed. Rather updateDisplayList sets the visible property as > >> >> well. That's something I'm trying to rectify now, so that measure() > >> >> will be correct, but I'm running into some problems (eg. charting > >> >> classes expecting a parent). Any suggestions regarding this aspect? > >> >> I'm trying something like the following. > >> >> > >> >> public function set selectedChild(child:DisplayObject) : void { > >> >> trace("selectedChild"); > >> >> _selectedChild = child; > >> >> if (child == null) { > >> >> this.removeAllChildren(); > >> >> for each (var child:DisplayObject in _savedTiles) { > >> >> this.addChild(child); > >> >> } > >> >> _savedTiles = null; > >> >> } else { > >> >> _savedTiles = this.getChildren(); > >> >> this.removeAllChildren(); > >> >> this.addChild(_selectedChild); > >> >> } > >> >> invalidateSize(); > >> >> } > >> >> > >> >> I thought of using visible/includinLayout, but then I'd have to > >> >> introduce the child-is-UIComponent assumption (which I realize may > >> >> ultimately be necessary). > >> >> > >> >> On Sat, Jun 7, 2008 at 9:35 AM, Daniel Gold <[EMAIL PROTECTED]> > >> >> wrote: > >> >>> You may want to look at the code in PodLayoutManager.as from the > Flex > >> >>> Dashboard example as it seems to be very similar to what you're > doing > >> >>> > >> >>> http://examples.adobe.com/flex3/devnet/dashboard/main.html > >> >>> > >> >>> > >> >>> On Fri, Jun 6, 2008 at 12:04 AM, Josh McDonald <[EMAIL PROTECTED]> > >> >>> wrote: > >> >>>> > >> >>>> Measure can always be bigger than the actual width/height, that's > >> >>>> what > >> >>>> it's for. > >> >>>> > >> >>>> On Fri, Jun 6, 2008 at 11:32 AM, Richard Rodseth < > [EMAIL PROTECTED]> > >> >>>> wrote: > >> >>>>> > >> >>>>> No, I mean like zooming a window. I think the problem lies in how > I > >> >>>>> tell the TiledCanvas that one of its children is the zoomed one > >> >>>>> (setting "visible" of all the others to false in > updateDisplayList). > >> >>>>> Stay tuned. > >> >>>>> > >> >>>>> However, setting that aside, it also seems as though I might be > >> >>>>> commiting a hack if I allow the measured size of the TiledCanvas > to > >> >>>>> remain larger than its bounds, even though it allows the scrolling > >> >>>>> to > >> >>>>> work (at least in the all-tiles-shown case). > >> >>>>> > >> >>>>> On Thu, Jun 5, 2008 at 5:46 PM, Josh McDonald <[EMAIL PROTECTED]> > >> >>>>> wrote: > >> >>>>> > I'm not sure exactly what you're doing, or what you're trying to > >> >>>>> > achieve > >> >>>>> > yet. By "expanding a tile" do you mean you're setting the > minimum > >> >>>>> > to > >> >>>>> > be > >> >>>>> > bigger, or you're manually overriding the decisions the base > >> >>>>> > Container > >> >>>>> > implementation makes in updateDisplayList()? > >> >>>>> > > >> >>>>> > On Fri, Jun 6, 2008 at 10:41 AM, Richard Rodseth > >> >>>>> > <[EMAIL PROTECTED]> > >> >>>>> > wrote: > >> >>>>> >> > >> >>>>> >> The docs say: > >> >>>>> >> > >> >>>>> >> If the horizontalScrollPolicy is ScrollPolicy.AUTO, the > >> >>>>> >> horizontal > >> >>>>> >> scroll bar appears when all of the following are true: > >> >>>>> >> > >> >>>>> >> * One of the container's children extends beyond the left edge > or > >> >>>>> >> right edge of the container. > >> >>>>> >> * The clipContent property is true. > >> >>>>> >> * The width and height of the container are large enough to > >> >>>>> >> reasonably accommodate a scroll bar. > >> >>>>> >> > >> >>>>> >> And sure enough, if I set a static minimum on tiledView, I get > >> >>>>> >> the > >> >>>>> >> desired effect. > >> >>>>> >> > >> >>>>> >> If I expand a tile and change the minimum to something else, > any > >> >>>>> >> idea > >> >>>>> >> which invalidate method(s) I should call? > >> >>>>> >> > >> >>>>> >> On Thu, Jun 5, 2008 at 4:57 PM, Josh McDonald < > [EMAIL PROTECTED]> > >> >>>>> >> wrote: > >> >>>>> >> > If you want to be able to measure your subcomponents, always > >> >>>>> >> > use > >> >>>>> >> > setActualSize. I learned that the hard way recently :) > >> >>>>> >> > > >> >>>>> >> > I've recently been doing a whole bunch of measure and > >> >>>>> >> > updatedisplaylist > >> >>>>> >> > voodoo for a custom container, so I'll be slightly helpful! > >> >>>>> >> > > >> >>>>> >> > -Josh > >> >>>>> >> > > >> >>>>> >> > On Fri, Jun 6, 2008 at 9:36 AM, Richard Rodseth > >> >>>>> >> > <[EMAIL PROTECTED]> > >> >>>>> >> > wrote: > >> >>>>> >> >> > >> >>>>> >> >> Clearly I haven't mastered layout and measurement. > >> >>>>> >> >> > >> >>>>> >> >> I've implemented a custom component which tiles its children > >> >>>>> >> >> in > >> >>>>> >> >> equal-sized tiles, but also has a state (not a flex state) > >> >>>>> >> >> where > >> >>>>> >> >> one > >> >>>>> >> >> tile fills the component. > >> >>>>> >> >> > >> >>>>> >> >> I subclassed Canvas and set the sizes and positions of > >> >>>>> >> >> children in > >> >>>>> >> >> updateDisplayList. I didn't override measure(), but it works > >> >>>>> >> >> very > >> >>>>> >> >> nicely, resizing children smoothly as it is resized. > >> >>>>> >> >> > >> >>>>> >> >> Now, however, I would like to set a minimum width and height > >> >>>>> >> >> for > >> >>>>> >> >> the > >> >>>>> >> >> tiled view, after which scroll bars appear. The minimum will > >> >>>>> >> >> be > >> >>>>> >> >> different if the component is in the one-tile-expanded case. > >> >>>>> >> >> > >> >>>>> >> >> Can I do this without further mods to my component? > >> >>>>> >> >> Should my updateDisplayList be calling setActualSize rather > >> >>>>> >> >> than > >> >>>>> >> >> setting x,y,width, height? > >> >>>>> >> >> Should I have a measure() implementation? > >> >>>>> >> >> How would it differ from the inherited one? > >> >>>>> >> >> In a scenario like the following, would I set the minWidth > and > >> >>>>> >> >> minHeight on the parent or child? > >> >>>>> >> >> Or, to ask another way, do the the scrollpolicy and minimum > >> >>>>> >> >> properties > >> >>>>> >> >> always belong on the same component? > >> >>>>> >> >> > >> >>>>> >> >> <mx:Canvas id="scrollableArea" width="100%" height="100%" > >> >>>>> >> >> verticalScrollPolicy="auto" > >> >>>>> >> >> horizontalScrollPolicy="auto"> > >> >>>>> >> >> > >> >>>>> >> >> <view:TiledCanvas id="tiledView" > >> >>>>> >> >> width="100%" height="100%" > >> >>>>> >> >> > > >> >>>>> >> >> </view:TiledCanvas> > >> >>>>> >> >> </mx:Canvas> > >> >>>>> >> >> > >> >>>>> >> >> Thanks. > >> >>>>> >> > > >> >>>>> >> > > >> >>>>> >> > > >> >>>>> >> > -- > >> >>>>> >> > "Therefore, send not to know For whom the bell tolls. It > tolls > >> >>>>> >> > for > >> >>>>> >> > thee." > >> >>>>> >> > > >> >>>>> >> > :: Josh 'G-Funk' McDonald > >> >>>>> >> > :: 0437 221 380 :: [EMAIL PROTECTED] > >> >>>>> >> > > >> >>>>> > > >> >>>>> > > >> >>>>> > > >> >>>>> > -- > >> >>>>> > "Therefore, send not to know For whom the bell tolls. It tolls > for > >> >>>>> > thee." > >> >>>>> > > >> >>>>> > :: Josh 'G-Funk' McDonald > >> >>>>> > :: 0437 221 380 :: [EMAIL PROTECTED] > >> >>>>> > > >> >>>> > >> >>>> > >> >>>> > >> >>>> -- > >> >>>> "Therefore, send not to know For whom the bell tolls. It tolls for > >> >>>> thee." > >> >>>> > >> >>>> :: Josh 'G-Funk' McDonald > >> >>>> :: 0437 221 380 :: [EMAIL PROTECTED] > >> >>> > >> >>> > >> >> > >> >> > >> > > > > > > > > > -- > > "Therefore, send not to know For whom the bell tolls. It tolls for thee." > > > > :: Josh 'G-Funk' McDonald > > :: 0437 221 380 :: [EMAIL PROTECTED] > > > > ------------------------------------ > > -- > Flexcoders Mailing List > FAQ: http://groups.yahoo.com/group/flexcoders/files/flexcodersFAQ.txt > Search Archives: > http://www.mail-archive.com/flexcoders%40yahoogroups.comYahoo! Groups > Links > > > > -- "Therefore, send not to know For whom the bell tolls. It tolls for thee." :: Josh 'G-Funk' McDonald :: 0437 221 380 :: [EMAIL PROTECTED]

