2016-06-08 11 views
0

I Scene Graph Component bin mit eine Anwendung mit MarkupList und MarkupGrid zu entwickeln. Ich möchte ein benutzerdefiniertes Dialogfeld geöffnet, wenn Benutzer von der Anwendung beenden. Ich benutze roImageCanvas, um benutzerdefinierte Dialogfeld zu erstellen, aber nicht wissen, wie dies implementiert wird. Main.brs Datei Code ist ...So verwenden roImageCanvas in Szenengraph Komponente

sub main() 
screen = CreateObject("roSGScreen") 
m.port = CreateObject("roMessagePort") 
screen.setMessagePor`enter code here`t(m.port) 
scene = screen.CreateScene("HomeScene") 
screen.show() 

while(true) 
msg = wait(1000, m.port) 
msgType = type(msg) 
if msgType = "roSGScreenEvent" 

if msg.isScreenClosed() then showImageCanvas() 
end if 
end while 
end sub 

und roImageCanvas Code ist ...

Sub showImageCanvas() 
print "sdfsdf" 
canvasItems = [ 
{ 
url:"http://192.168.1.23/boardwalk.jpg" 
TargetRect:{x:100,y:100,w:400,h:300} 
}, 
{ 
url:"http://192.168.1.23/walking.jpg" 
TargetRect:{x:500,y:400,w:400,h:300} 
}, 
{ 
Text:"Hello ImageCanvas" 
TextAttrs:{Color:"#FFCCCCCC", Font:"Medium", 
HAlign:"HCenter", VAlign:"VCenter", 
Direction:"LeftToRight"} 
TargetRect:{x:390,y:357,w:500,h:60} 
} 
] 

canvas = CreateObject("roImageCanvas") 
port = CreateObject("roMessagePort") 
canvas.SetMessagePort(port) 
'Set opaque background 
canvas.SetLayer(0, {Color:"#FF000000", CompositionMode:"Source"}) 
canvas.SetRequireAllImagesToDraw(true) 
canvas.SetLayer(1, canvasItems) 
canvas.Show() 
while(true) 
msg = wait(0,port) 
if type(msg) = "roImageCanvasEvent" then 
if (msg.isRemoteKeyPressed()) then 
i = msg.GetIndex() 
print "Key Pressed - " ; msg.GetIndex() 
if (i = 2) then 
' Up - Close the screen. 
canvas.close() 
end if 
else if (msg.isScreenClosed()) then 
print "Closed" 
return 
end if 
end if 
end while 
End Sub 

Im Allgemeinen möchte ich, wenn User-Exit von App showImageCanvas() aufgerufen werden soll. Ich habe auch versucht, showImageCanvas() Code in Scene-Datei zu setzen, aber es gibt immer Fehler, also bitte schlage mir vor, was ich falsch mache.

Antwort

2

Wenn Sie Scene Graph Komponente verwenden, sollten Sie nur einen Bildschirm verwenden - roSGScreen und eine Szene. Um Dialoge anzuzeigen, sollten Sie auch Szenendiagramm Toolset verwenden. Es gibt Dialog Komponente für diesen Zweck. Um zu zeigen, Bestätigungsdialog vor Kanal schließen, können Sie onKeyEvent Beobachter zu Ihrem HomeScene und Show Dialog wie folgt hinzufügen:

function onKeyEvent(key as String, press as Boolean) as Boolean 
    handled = false 

    if press 
     if key = "back" 
      showExitConfirmationDialog() 
      handled = true 
     end if 
    end if 

    return handled 
end function 


sub showExitConfirmationDialog() 
    dialog = createObject("roSGNode", "Dialog") 
    dialog.message = "Are you sure you want to exit?" 
    dialog.buttons = ["Cancel", "Exit"] 
    dialog.observeField("buttonSelected", "onDialogButtonSelected") 
    m.top.dialog = dialog 
end sub 


sub onDialogButtonSelected() 
    if m.top.dialog.buttonSelected = 1 
     m.top.close = true 
    else 
     m.top.dialog.close = true 
    end if 
end sub 

Beachten Sie, dass es nicht möglich ist Startseite Taste Ereignis abfangen, Startseite Taste schließt den Kanal trotzdem.

Um die App, Szene "close" Feld verwendet wird, ist hier in der Nähe, wie Sie es hinzufügen:

<?xml version="1.0" encoding="UTF-8"?> 
<component name="HomeScene" extends="Scene" xsi:noNamespaceSchemaLocation="http://rokudev.roku.com/rokudev/schema/RokuSceneGraph.xsd"> 

<script type="text/brightscript" uri="pkg:/components/HomeScene.brs"/> 

<interface> 
    <field id="close" type="bool"/> 
</interface> 

</component> 

es auch beobachten, in der Hauptfunktion:

sub main(params as Object) 
    screen = createObject("roSGScreen") 
    scene = screen.createScene("HomeScene") 
    port = createObject("roMessagePort") 
    screen.setMessagePort(port) 
    screen.show() 

    scene.observeField("close", port) 

    while true 
     msg = wait(0, port) 

     if type(msg) = "roSGNodeEvent" 
      if msg.getField() = "close" and msg.getData() 
       return 
      end if 
     end if 
    end while 
end sub 
+0

Eugene Smoliy # Danke für die Antwort. Können Sie bitte vorschlagen, wie Sie die Schaltfläche des Dialogfelds anpassen? – anil

+0

[Dialog] (https://sdkdocs.roku.com/display/sdkdoc/Dialog) hat das Feld "buttonGroup", das Sie anstelle von "buttons" verwenden können, wenn Sie weitere Anpassungen benötigen. Sie müssen dort den Knoten [ButtonGroup] (https://sdkdocs.roku.com/display/sdkdoc/ButtonGroup) anstelle des String-Arrays einstellen. –

+0

Eugene Smoliy @ Unterstützt roku die Pause/Fortsetzen-Funktion während der Video-Pufferung? Ich benutze ".m3u8" Dateiformat. – anil