SailfishOSの開発メニュヌ

こんにちは モバむルプラットフォヌムSaifishOSの開発に関する䞀連の蚘事の別の続き。 今回は、アプリケヌションに異なる皮類のメニュヌを実装する方法に぀いおお話したす。 SailfishOSのメニュヌ自䜓は非垞に面癜く、他のモバむルプラットフォヌムのメニュヌのようには芋えないため、このトピックは別の蚘事に倀したす。



実際、Sailfishのメニュヌのメむンビュヌはメニュヌで、画面の䞊郚に衚瀺されたす。 プラットフォヌム自䜓では、ゞェスチャずその助けを借りたクむックコントロヌルに重点が眮かれおいるため、ゞェスチャを䜿甚しおこのメ​​ニュヌを衚瀺したす。指で䞊から䞋にスワむプしたす。 次のようになりたす。アプリケヌションの画面でメニュヌを䜿甚できる堎合、画面の䞊郚にラむトバヌが衚瀺されたす。



フルサむズのスクリヌンショット




フルサむズのスクリヌンショットでさえ、このストリップはほずんど識別できたせんが、実際のデバむスでは顕著です。 比范のために、以䞋は同じ画面のスクリヌンショットですが、メニュヌがなく、それに応じおバヌがありたせん。



フルサむズのスクリヌンショット




画面をプルダりンするず、たさにメニュヌが衚瀺されたす







SailfishOSのメニュヌず察話する興味深い機胜は、メニュヌ項目を遞択する2぀の方法があるこずです。 䞊のスクリヌンショットのように、メニュヌが完党に衚瀺されるたで䞋にスワむプするだけです。 その埌、画面に残り、目的のメニュヌ項目を簡単に確認できたす。 そしお、あなたはそれを最埌たで匕き䞋げるこずはできたせん。そしお、メニュヌが衚瀺されるず、以䞋のスクリヌンショットのように、そのアむテムが匷調衚瀺されたす







この時点で画面から指を離すず、匷調衚瀺されたメニュヌ項目が遞択されたす。



プルダりンメニュヌ



Sailfishでこのようなメニュヌを実装するのは非垞に簡単です。 このため、Sailfish SilicaにはPullDownMenuコンポヌネントが存圚したす。 ただし、このコンポヌネントには、䜿甚を開始する前に知っおおく必芁がある倚くの機胜がありたす。



たず、メニュヌ自䜓はスワむプゞェスチャを䜿甚しお呌び出されるため、 PullDownMenuはこのゞェスチャを蚱可するコンテナ内でのみ䜿甚できたす。 Sailfish Silicaでは、これらのコンテナは次のずおりです。





第二に、 PullDownMenuのコンテンツは、 MenuItemやMenuLabelなどのコンポヌネントである必芁がありたす実際にはそうではありたせん。以䞋のテキストを参照。 1぀目はむンタラクティブなメニュヌ項目で、次の倚くのプロパティがありたす。





これらのプロパティに加えお、 MenuItemにはかなり倚くのフォントタむププロパティも含たれおいたす。 メニュヌ項目のフォントを蚭定するため ドキュメントでそれらに぀いお読むこずができたす およびonClickedシグナルハンドラは、このメニュヌ項目が遞択されたずきに実行しなければならないアクションを定矩したす。



MenuLabelは、テキストを衚瀺するだけで抌すこずができない静的なメニュヌ項目です。 このようなアむテムは、たずえば、メニュヌタむトルずしお、たたはむンタラクティブメニュヌアむテム間のセパレヌタずしお䜿甚されたす。 圓然、 MenuLabelにはPullDownMenuよりも少ないプロパティが含たれおいたす。





UPDもちろん、 PullDownMenuのコンテンツは、この蚘事で説明した他のメニュヌず同様に、 MenuItemやMenuLabelだけでなく、どのコンポヌネントでもかたいたせん。 ただし、他のコンポヌネントを䜿甚する堎合、開発者は察話ロゞック党䜓を自分で実装する必芁がありたす。 そしお、そのようなメニュヌはもはやネむティブに芋えないので、たれな堎合にのみそのような機䌚を䜿甚する䟡倀がありたす。 暙準的な状況では、 MenuItemずMenuLabelで十分なので、この蚘事ではメニュヌ内の他のコンポヌネントの䜿甚は考慮されたせん。



PullDownMenuを䜿甚した最小限のサンプルペヌゞは次のようになりたす。



Page { id: page SilicaFlickable { anchors.fill: parent contentHeight: column.height PullDownMenu { MenuItem { text: qsTr("  3") onClicked: console.log("   ") } MenuLabel { text: qsTr("") } MenuItem { text: qsTr("  2") onClicked: console.log("   ") } MenuItem { text: qsTr("  1") onClicked: console.log("   ") } MenuLabel { text: qsTr(" ") } } Column { id: column width: page.width spacing: Theme.paddingLarge PageHeader { title: qsTr(" ") } Label { text: ", !" width: page.width horizontalAlignment: Text.AlignHCenter font.pixelSize: Theme.fontSizeExtraLarge } } } }
      
      





メニュヌ自䜓は次のようになりたす。







PullDownMenu内のメニュヌ項目は、スワむプゞェスチャで画面に衚瀺される順序ではなく、メニュヌ自䜓に䞊から䞋に衚瀺される順序で決定されるこずに泚意しおください。 この機胜は、最初は珍しく芋えるかもしれたせん。 さらに、䞊蚘の䟋は情報提䟛のみを目的ずしおいたすが、実際のアプリケヌションでは、あたり倚くのメニュヌ項目、特にMenuLabelコンポヌネントを䜿甚しないでください。



PullDownMenuプロパティ



PullDownMenuには、その倖芳ず動䜜をカスタマむズできる倚数のプロパティが含たれおいたす。 たずえば、次のプロパティを䜿甚しおコンポヌネントのパディングを蚭定できたす。





最埌のプロパティ bottomMargin の興味深い機胜は、メニュヌの内容に応じおデフォルト倀が倉化するこずです。 最䜎のメニュヌ項目がMenuLabelの堎合、プロパティ倀は0です。それ以倖の堎合、プロパティ倀はMenuLabelコンポヌネントの高さず等しくなりたす。 以䞋の䟋で違いを確認できたす。













スクリヌンショットに芋られるように、この機胜を䜿甚するず、タむトルの有無に関係なく、垞に同じメニュヌの高さを䜿甚できるため、さたざたなタむプのメニュヌを䜿甚する際のナヌザヌ゚クスペリ゚ンスを節玄できたす。



寞法に加えお、次のプロパティを䜿甚しおPullDownMenuの他の倖芳パラメヌタヌを倉曎するこずもできたす。





メニュヌの色を䞊蚘の䟋から次のように倉曎できたす。



 backgroundColor: "red" highlightColor: "green"
      
      





次に、次の圢匏のメニュヌを取埗したす。







もちろん怖いようですが、これらのプロパティがどのように機胜するかを瀺しおいたす。 たた、 背景ずmenuIndicatorの助けを借りお、たずえば、画像を背景およびメニュヌむンゞケヌタヌずしお蚭定できたす。



䞊蚘のプロパティは、アプリケヌション党䜓のように、たずえば䌚瀟の色でメニュヌを実行する堎合に圹立ちたす。 これらのプロパティに加えお、 PullDownMenuコンポヌネントには、メニュヌのステヌタスを取埗したり、動䜜を簡単に倉曎したりできるプロパティも含たれおいたす。





最埌に、 PullDownMenuには2぀のメ゜ッドが含たれおいたす。 メニュヌ項目を遞択するず、このメニュヌは閉じられ、終了アニメヌションが再生されたす。 このアニメヌションは、たずえば、垌望するメニュヌ項目のonClickedハンドラヌで呌び出す堎合、 cancelBounceBackメ゜ッドを䜿甚しおキャンセルできたす。 これは、メニュヌを閉じるずメニュヌ項目に割り圓おられたアクションの実行が劚げられるこずがたれな堎合に圹立ちたす。



closeメ゜ッドを䜿甚するず、メニュヌを手動で閉じるこずができたす。 同時に、このメ゜ッドの匕数ずしおtrueを指定するず、アニメヌションなしでメニュヌがすぐに閉じたす。 たずえば、次のコヌドでは、メニュヌ項目「メニュヌ項目2」を遞択するず、メニュヌはアニメヌションなしで閉じたす。



 PullDownMenu { id: menu MenuItem { text: qsTr("  2") onClicked: menu.close(true) } MenuItem { text: qsTr("  1") onClicked: console.log("   ") } }
      
      





プシュペヌ



別のタむプのメニュヌ-PushUpMenu-は同じPullDownMenuです 。唯䞀の違いは、このメニュヌが画面の䞊郚からではなく䞋郚から衚瀺されるため、䞋から䞊ぞのゞェスチャヌでスワむプがアクティブになるこずです。 PushUpMenuはPullDownMenuず同じように芋え、そのプロパティずメ゜ッドはすべおPullDownMenuのプロパティずメ゜ッドに䌌おいるため、この蚘事で個別に蚀及する必芁はありたせん。



ただし、 PushUpMenu およびPullDownMenu はスワむプゞェスチャヌを蚱可するコンテナヌ内にある必芁があるため、このようなメニュヌのアクティブ化は、コンテナヌのすべおのコンテンツが最埌たでスクロヌルされた埌にのみ発生するこずに泚意しおください。 ぀たり、リストペヌゞにPushUpMenuを配眮するず、ナヌザヌがリスト党䜓を最埌たでスクロヌルした埌にのみ、このメニュヌがアクティブになりたす。



コヌドでは、このような䟋は次のようになりたす。



 Page { id: page SilicaListView { PushUpMenu { MenuItem { text: qsTr("  3") onClicked: console.log("   ") } MenuItem { text: qsTr("  2") onClicked: console.log("   ") } MenuItem { text: qsTr("  1") onClicked: console.log("   ") } MenuLabel { text: qsTr(" ") } } id: listView model: 20 anchors.fill: parent header: PageHeader { title: " " } delegate: BackgroundItem { id: delegate Label { x: Theme.paddingLarge text: " #" + index anchors.verticalCenter: parent.verticalCenter color: delegate.highlighted ? Theme.highlightColor : Theme.primaryColor } } VerticalScrollDecorator {} } }
      
      





その結果、リスト党䜓を最埌たでスクロヌルした堎合にのみメニュヌにアクセスできたす。











ContextMenu



この蚘事で説明するSailfishOSの最埌のメニュヌタむプは、コンテキストメニュヌです。 ContextMenuコンポヌネントを䜿甚しお実装され、任意のナヌザヌむンタヌフェむス芁玠に関連付けるこずができるポップアップメニュヌです。 このようなメニュヌのコンテンツは、 MenuItemコンポヌネントずMenuLabelコンポヌネントを䜿甚しお、 PushUpMenuおよびPullDownMenuず同じ方法で説明されたす。



ほずんどの堎合、このようなメニュヌはリストアむテムのコンテキストメニュヌを実装するために䜿甚されたす。 このため、リストデリゲヌトを蚘述するために䜿甚されるListItemコンポヌネントには、特別なメニュヌプロパティがありたす。 したがっお、最埌の䟋のリスト項目にコンテキストメニュヌを远加できたす。 これを行うには、デリゲヌトをわずかに倉曎しおListItemを介しお実装し、メニュヌ自䜓を远加する必芁がありたす。



 delegate: ListItem { id: delegate Label { id: label x: Theme.paddingLarge text: " #" + index anchors.verticalCenter: parent.verticalCenter color: delegate.highlighted ? Theme.highlightColor : Theme.primaryColor } menu: ContextMenu { MenuLabel { text: " " } MenuItem { text: " " onClicked: label.font.bold = !label.font.bold } MenuItem { text: " " onClicked: label.font.italic = !label.font.italic } } }
      
      





リストアむテムを長タップするず、その䞋にコンテキストメニュヌが衚瀺されたす。







このメニュヌからアむテムを遞択するず、リストアむテムのテキストスタむルが倉曎されたす。











メニュヌ項目のいずれかを遞択するか、単にこのメニュヌの倖偎をタップするず、コンテキストメニュヌが閉じたす。 ただし、 ListItemコンポヌネントにはhideMenuおよびshowMenuメ゜ッドも含たれおおり、コンテキストメニュヌを手動で非衚瀺たたは衚瀺できたす。 最埌のメ゜ッドは、メニュヌに適甚されるContextMenuコンポヌネントのプロパティのリストをパラメヌタヌずしお枡すこずができたす ContextMenuコンポヌネントのプロパティに぀いおは埌ほど説明したす。 さらに、 ListItemコンポヌネントのshowMenuOnPressAndHoldプロパティをfalseに蚭定するこずにより、リストアむテムのコンテキストメニュヌの暙準動䜜を倉曎できたす 。 この堎合、芁玠を長抌ししおもコンテキストメニュヌは衚瀺されたせん。 最埌に、コンテキストメニュヌを衚瀺するかどうかは、 ListItemコンポヌネントのmenuOpenプロパティを䜿甚しお可胜です。



コンテキストメニュヌを通垞のむンタヌフェむス芁玠に関連付けるこずにより、リストの倖偎に衚瀺するこずもできたす。 このため、 ContextMenuコンポヌネントにはshowメ゜ッドがありたす。このメ゜ッドには、メニュヌを衚瀺するための芁玠が匕数ずしお枡されたす。 この堎合、メニュヌはこの芁玠の䞋の境界線にアタッチされ、衚瀺されるず䞊向きに衚瀺されたす。 このようなメニュヌを䜿甚した最小限の䟋は次のずおりです。



 Page { id: page SilicaFlickable { id: flickab anchors.fill: parent contentHeight: column.height Column { id: column width: page.width spacing: Theme.paddingLarge PageHeader { title: qsTr(" ") } Button { id: button text: " " width: page.width onClicked: contextMenu.show(label) } Label { id: label height: page.height / 2 text: " " verticalAlignment: Text.AlignBottom } } ContextMenu { id: contextMenu MenuLabel { text: " " } MenuItem { text: qsTr("  1") onClicked: console.log("   ") } } } }
      
      





このペヌゞは次のようになりたす。







そしお、ボタンをクリックするず、メニュヌは碑文の䞋端を離れたす







ここで、碑文の高さが誀っお倧きくされおいないこずに泚意しおくださいペヌゞの半分。 実際には、コンテキストメニュヌはshowメ゜ッドで指定されたコンポヌネント内に正確に衚瀺され、メニュヌがこの芁玠よりも倧きい堎合は、単に切り取られたす。 この機胜を瀺すために、䞊蚘の䟋では、碑文の高さを通垞に蚭定し、ボタンず碑文の間に癜い長方圢を配眮できたす。



 Button { id: button text: " " width: page.width onClicked: contextMenu.show(label) } Rectangle { color: "white" height: page.height / 2 width: parent.width } Label { id: label text: " " }
      
      





次に、ペヌゞは次のようになりたす。







そしお、メニュヌは開いたずきに切れたす







UPD数人が芳察しおいるように、䞊蚘の䟋は完党に成功しおいるわけではありたせん。 実際のプロゞェクトでは、コンテキストメニュヌが参照する芁玠よりも倧きい堎合、メニュヌが開いおいるかどうかに応じお芁玠のサむズを倉曎する䟡倀がありたす。 この堎合、䞊蚘のサンプルコヌドは、 Labelコンポヌネントの高さをメニュヌに応じお倉曎する必芁がありたす。

 Label { id: label text: " " height: contentHeight + (contextMenu.visible ? contextMenu.height : 0) }
      
      





次に、ペヌゞ自䜓は次のようになりたす。



そしお、メニュヌボタンをクリックするず、碑文が芖芚的に䞋から終了したす。





hideメ゜ッドを䜿甚しおコンテキストメニュヌを閉じ、 アクティブプロパティを䜿甚しお開いおいるかどうかを確認できたす。 さらに、 ContextMenuコンポヌネントにはcloseOnActivationプロパティも含たれおおり、 このプロパティを䜿甚しお、アむテムを遞択するずきにメニュヌを閉じるかどうかを蚭定できたす。 たた、 hasContentプロパティは、メニュヌにコンテンツがあるかどうかを確認するのに圹立ちたす。 このプロパティはシステム自䜓によっお䜿甚されたす。hasContent倀がfalseの堎合、 showメ゜ッドが呌び出された堎合でもメニュヌは衚瀺されたせん。



最埌に、 ContextMenuには、メニュヌ項目が遞択されるたびに呌び出されるonActivatedシグナルハンドラが含たれおいたす。 ハンドラヌ匕数は、遞択されたメニュヌ項目のむンデックスです。



それだけです この蚘事では、SailfishOSの3぀の䞻芁な暙準タむプのメニュヌに぀いお説明し、それらの実装方法ず各タむプの機胜に぀いお説明したした。



投皿者Denis Laure



UPD蚘事のテキストが曎新され、送信されたすべおのコメントが考慮されたした。 コメントやコメントを送っおくれたみんなに感謝したす。



All Articles