My channel uses two LayoutGroups to render a menu along the top of the front page. The content of the left LayoutGroup is dynamically populated, based on server response, whereas the content of the right LayoutGroup has two fixed items, “Search” and “Log in” (in Danish on the screenshots below).
I run regression tests, comparing screenshots of my channel with a set of “expected” ones, and every once in a while (less than once every thousand channel loads, probably closer to once in ten thousand loads), my test will fail because the labels of the two static items to the right overlap. It seems that Roku could have placed the left edge of the menu item “SØG” at the position that the right edge of that label should have been. Surely something is wrong as the two labels overlap, and it surprises me that the problem manifests with the items that are not dynamically generated, but statically declared in my XML file (included below).
Most recently, I have seen this on a Roku 3900X running firmware version 11.0.0.4193.
I hope that someone else have seen a similar issue, and may have suggestions for a workaround.
Regards
Jes
<?xml version="1.0" encoding="utf-8" ?>
<component name="VideoScene" extends="Scene">
<children>
<RegistryTask id="RegistryTask"/>
<Rectangle
color="#FFFFFF"
width="1920"
height="1080"
opacity="1"
translation="[0,0]" />
<Poster
id="Wallpaper"
width="1920"
height="1080"
translation="[0,0]"
visible="false"/>
<Group
id="UpNextGroup"
visible="false"
translation="[1392,48]">
<Rectangle
color="#FFFFFF"
width="480"
height="360"
opacity="0.7"
translation="[0,0]"/>
<RowList
id="UpNextRowList"
itemComponentName="DrItem"
itemSize="[384,216]"
numRows="1"
rowHeights="[375]"
rowSpacings="[0]"
rowItemSize="[[384,216]]"
rowItemSpacing="[[48,20]]"
showRowCounter="[false]"
translation="[48,48]">
<ContentNode/>
</RowList>
</Group>
<Group id="VideoGroup"/>
<Group
id="HomeScreen"
translation="[0,150]"
clippingRect="[0, 0, 1920, 1080]"
visible="true">
<Rectangle
color="#FFFFFF"
width="1920"
height="1080"
opacity="0.7"
translation="[0,0]" />
<DrRowList
id="HomeRow"
translation="[120,48]"
height="1080"
width="1680"
numRows="4"/>
</Group>
<Animation
id="SlideOutAnimation"
duration="0.3"
easeFunction="outCubic" >
<Vector2DFieldInterpolator
id = "myInterp2"
key="[0.0, 1.0]"
keyValue="[ [0.0, 690.0], [0.0, 1080.0] ]"
fieldToInterp="HomeScreen.translation" />
</Animation>
<Animation
id="SlideInAnimation"
duration="0.3"
easeFunction="outCubic" >
<Vector2DFieldInterpolator
id = "myInterp2"
key="[0.0, 1.0]"
keyValue="[ [0.0, 1080.0], [0.0, 690.0] ]"
fieldToInterp="HomeScreen.translation" />
</Animation>
<Animation
id="HomeSlideAnimation"
duration="0.4"
easeFunction="outCubic" >
<Vector2DFieldInterpolator
key="[0.0, 1.0]"
keyValue="[ [0.0, 0.0], [0.0, 1111.0] ]"
fieldToInterp="HomeScreen.translation" />
</Animation>
<Animation
id="MenuAnimation"
duration="0.15"
easeFunction="cubic" >
<Vector2DFieldInterpolator
id = "translation"
key="[0.0, 1.0]"
keyValue="[ [0.0, 690.0], [0.0, 1080.0] ]"
fieldToInterp="MenuUnderline.translation" />
<FloatFieldInterpolator
id="width"
key= "[0.0, 1.0]"
keyValue= "[ 1, 0.2 ]"
fieldToInterp="MenuUnderline.width" />
</Animation>
<Animation
id="MenuSlideAnimation"
duration="0.15"
easeFunction="cubic" >
<Vector2DFieldInterpolator
id = "translation"
key="[0.0, 1.0]"
keyValue="[ [0.0, 0.0], [0.0, -180.0] ]"
fieldToInterp="Menu.translation" />
</Animation>
<Group
id="Menu"
translation="[0,0]">
<Rectangle
color="#FFFFFF"
width="1920"
height="180"/>
<Rectangle
id="AccountMenuBackground"
color="#FFFFFF"
width="96"
height="96"
translation="[1704,50]"
visible="false"/>
<Poster
uri="pkg:/images/circle192.png"
width="96"
height="96"
translation="[1704,50]"/>
<LayoutGroup
id="LeftMenu"
translation="[120,79]"
itemSpacings="[48]"
layoutDirection="horiz">
</LayoutGroup>
<LayoutGroup
id="RightMenu"
translation="[1800,79]"
itemSpacings="[48]"
layoutDirection="horiz"
horizAlignment="right">
<Label
id="SearchMenu"
color="0x000000"
text="SØG">
<Font role="font" uri="pkg:/res/drpublik_regular.otf" size="42"/>
</Label>
<Label
id="AccountMenu"
color="0x000000"
text="LOG IND"
horizAlign="center">
<Font role="font" uri="pkg:/res/drpublik_regular.otf" size="42"/>
</Label>
</LayoutGroup>
<Rectangle
id="MenuUnderline"
color="#000000"
width="0"
height="0"
opacity="1"
translation="[0,0]"
visible="false" />
</Group>
<Poster
id="Splash"
uri="pkg:/images/drsplash1_$$res$$.png"
width="1920"
height="1080"
translation="[0,0]"
visible="true"/>
<Dialog
id="LoginDialog"
title="Log ind"
message="Åbn www.dr.dk/drtv/kode på din computer eller tablet, og tast denne kode: RET4WR"
buttons="["Annullér"]"
visible="false" />
<Timer id="LoginTimer" repeat="false" duration="1" />
<Dialog
id="LogoutDialog"
title="Log ud"
message="Bekræft at din DR konto skal fjernes fra denne enhed."
buttons="["OK", "Annullér"]"
visible="false" />
<Dialog
id="DeveloperDialog"
title="Developer Info"
buttons="["OK"]"
visible="false" />
<Timer id="DeveloperTimer" repeat="false" duration="1" />
<DrBusySpinner
id="SpinnerDialog"
visible="false"
size="144"
translation="[960,540]" />
<Timer id="SpinnerTimer" repeat="false" duration="3" />
<Dialog
id="Warning"
visible="false" />
<Font id="MenuFont" uri = "pkg:/res/drpublik_regular.otf" size = "42" />
<Timer id="UserAccountTimer" repeat="false" />
<Timer id="UserProfileTimer" repeat="false" />
</children>
<interface>
<field id="homeRowSelected" type="int" alias="HomeRow.rowSelected" onChange="onHomeRowSelected"/>
<field id="homeRowItemSelected" type="intarray" alias="HomeRow.rowItemSelected" onChange="onHomeItemSelected"/>
<field id="homeRowItemSelectedPlay" type="intarray" alias="HomeRow.rowItemSelectedPlay" onChange="onHomeItemSelectedPlay"/>
<field id="homeRowItemFocused" type="intarray" alias="HomeRow.rowItemFocused" onChange="onHomeItemFocused"/>
<field id="homeRowWarningMessage" type="string" alias="HomeRow.warningMessage" onChange="onHomeWarningMessage"/>
<field id="category" type="string" />
<field id="commandInput" type="assocarray" onChange="onCommandInput"/>
<field id="loginDialogButtonSelected" type="integer" alias="LoginDialog.buttonSelected" onChange="onLoginDialogButtonSelected"/>
<field id="loginDialogWasClosed" type="node" alias="LoginDialog.wasClosed" onChange="onLoginDialogWasClosed"/>
<field id="logoutDialogButtonSelected" type="integer" alias="LogoutDialog.buttonSelected" onChange="onLogoutDialogButtonSelected"/>
<field id="logoutDialogWasClosed" type="node" alias="LogoutDialog.wasClosed" onChange="onLogoutDialogWasClosed"/>
<field id="developerDialogButtonSelected" type="integer" alias="DeveloperDialog.buttonSelected" onChange="onDeveloperDialogButtonSelected"/>
<field id="developerDialogWasClosed" type="node" alias="DeveloperDialog.wasClosed" onChange="onDeveloperDialogWasClosed"/>
<field id="warningDialogButtonSelected" type="integer" alias="Warning.buttonSelected" onChange="onWarningDialogButtonSelected"/>
<field id="warningDialogWasClosed" type="node" alias="Warning.wasClosed" onChange="onWarningDialogWasClosed"/>
<field id="upNextRowListRowItemSelected" type="intarray" alias="UpNextRowList.rowItemSelected" onChange="onUpNextRowListItemSelected"/>
<field id="appExit" type="bool" alwaysnotify="true" value="false"/>
</interface>
<script type="text/brightscript" uri="pkg:/components/ImageUrl.brs"/>
<script type="text/brightscript" uri="pkg:/components/VideoScene.brs"/>
<script type="text/brightscript" uri="pkg:/components/UriUtils.brs"/>
<script type="text/brightscript" uri="pkg:/components/Utils.brs"/>
<script type="text/brightscript" uri="pkg:/res/config.brs"/>
</component>
