Forum Discussion
<component name="PosterWithFadeIn" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" extends="Poster" xsi:noNamespaceSchemaLocation="http://rokudev.roku.com/rokudev/schema/RokuSceneGraph.xsd"> <children>
<Poster id="myPoster" loadheight="250" loadwidth="400" width="400" height="250" uri="" opacity="0.0" />
<Animation id = "fadeIn" duration = "1" easeFunction = "linear" > <FloatFieldInterpolator key = "[ 0.0, 1.0 ]" keyValue = "[ 0.0, 1.0 ]" fieldToInterp = "myPoster.opacity" /> </Animation> </children> </component>
...
the in brs:
m.poster = m.top.findnode("MyPoster")
m.animation = m.top.findnode("fadeIn")
m.poster.uri = < uri >
then during times when you want the animation and the poster to show use this:
m.animation.control = "stop"
m.animation.control = "start"
stop it always before you start it. you can only start a stopped task.
- fry196 years agoBinge Watcher
speechlesUnfortunately this does not answer the question I am asking. The top component is already a Poster (<component ... extends="Poster"...>).
In Brightscript I can simply access the "opacity" of the component by writing "m.top.opacity" and I want to access this very field in the animation. Not create another poster inside a Poster component.
The solution you propose also has the issue that if you write <PosterWithFadeIn uri="xxxx"/> the attribute uri is applied to the main component, not the one you define inside (and that is true for every single attribute...). This is why I am extending from Poster...
The question is to access the opacity field of the main component (or any other field for that matter) via the fieldToInterp attribute in the animation.
- speechles6 years agoRoku Guru
<?xml version="1.0" encoding="utf-8" ?> <component name="PosterWithFadeIn" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" extends="Poster" xsi:noNamespaceSchemaLocation="http://rokudev.roku.com/rokudev/schema/RokuSceneGraph.xsd"> <interface>
<field id="height" type="integer" value="0" alwaysNotify="true" onChange="OnChange" />
<field id="width" type="integer" value="0" alwaysNotify="true" onChange="OnChange" />
<field id="uri" type="integer" value="0" alwaysNotify="true" onChange="OnChange" />
<field id="opacity" type="float" value="1.0" alwaysNotify="true" onChange="OnChange" />
<field id="translation" type="array" value="[0, 0]" alwaysNotify="true" onChange="OnChange" />
</interface> <children> <Poster id="idPoster" /> <Animation id = "fadeIn" duration = "1" easeFunction = "linear" > <FloatFieldInterpolator key = "[ 0.0, 1.0 ]" keyValue = "[ 0.0, 1.0 ]" control="start" fieldToInterp = "idPoster.opacity" /> </Animation> </children> </component>Then in the BRS:
Function OnChange() m.poster = m.top.findnode("idPoster") m.poster.height = m.top.height m.poster.width = m.top.width m.poster.opacity = m.top.opacity m.poster.uri = m.top.uri
m.poster.translation = m.top.translation End Function- fry196 years agoBinge Watcher
speechlesThank you for your answers. I understand what you are trying to achieve and I agree with you that what you propose will work.
But it is still not answering the question I am asking. The field of the top level component is accessible in Brightscript via "m.top.opacity".
My question is: how do I access it from the Animation / fieldToInterp attribute.
And maybe at the end of the day, the answer is that it is not possible. But this is the question I am asking. If it is not possible, then yes there are workarounds (like what you suggest, or implementing the interpolation via a timer which is what I did...), but I am interested to know if it is possible at all and if yes, how.