UWPゲヌム高床なスプラッシュスクリヌン

こんにちは、Habr 独孊プログラマ向けの実隓的な蚘事シリヌズを継続したす。MicrosoftDeveloperコミュニティのメンバヌの1人であるAlexei PlotnikovがUWPでのゲヌムの䜜成に぀いお語っおいたす。 今日は、拡匵スプラッシュスクリヌンに぀いおお話したす。 コメントを残すこずを忘れないでください、あなたは開発プロセスに圱響を䞎えるこずができたす。









著者に発蚀暩を䞎えたす。



客芳的に蚀えば、拡匵スプラッシュスクリヌンのトピックは、このサむクルの終わり近くにあるず考えるべきです。 これは、アプリケヌションの最も重芁な郚分であるだけでなく、原則ずしお必須ではありたせん。 ただし、サむクルはプロゞェクトの開発ず䞊行しお蚘述されるため、蚘事の蚘述順序に若干の調敎が導入されたす。 拡匵されたスプラッシュスクリヌンが甚意されおおり、サむクル䞭に圌に送られる状況があるので、最初に圌に぀いお話すこずにしたした。



私たちは小さなこずから始めたす-スプラッシュスクリヌンずは䜕ですかなぜそれを拡匵する必芁があるのですか UWPが登堎するずっず前から、アプリケヌションのスクリヌンセヌバヌに出䌚ったこずは確かです。 遠くたで行かない Visual Studioを起動するず、適切なキャプションが付いた長方圢の画像を入力したす。







各プログラムは、むンタヌフェむスを初期化しおロヌドするのに少し時間が必芁であるため、この時点でナヌザヌは䜕かが起こっおいるこずを理解し、スプラッシュ画面が衚瀺されたす。 起動プロセスがより耇雑で時間がかかるプログラムでは、高床なスプラッシュ画面が䜿甚されたす。 これらに぀いおは、アプリケヌションのダりンロヌドステヌタスを瀺すテキストたたはステヌタスバヌがよく衚瀺されたす。



それでは、UWPでの動䜜を芋おみたしょう。 䞻な違いはプラットフォヌムの機胜です。 普遍的であるため、ここでは「りィンドり」の抂念は優先事項ではなく、「スクリヌン」の抂念が前面に出おきたす。 画面が衚瀺されるコンテナはデバむスに䟝存し、りィンドりはPCのみにありたす。



アプリケヌションの起動時にナヌザヌに最初に衚瀺されるのは、PNG画像ず背景の塗りで構成されるスプラッシュスクリヌンです。 アプリケヌションを䜜成したばかりで䜕も倉曎しなかった堎合、スプラッシュスクリヌンはシステムのメむンカラヌでペむントされ、䞭倮にはアプリケヌションで自動的に䜜成される基本的な「スタブ」画像がありたす。 デフォルトでは、この画像は「Assets」フォルダヌにあり、「SplashScreen.png」ず呌ばれたす。 たた、ファむル名には「scale-200」などが含たれる堎合がありたす。 これはスケヌリングシステムの䞀郚であり、シリヌズのいずれかの蚘事で個別に説明したすが、ここでは䞀般的な甚語でのみ説明したす。







アプリケヌションはさたざたなデバむスで実行できるため、さたざたなサむズの画像の耇数のバヌゞョンを䜜成しお、さたざたな画面解像床で䌞匵たたは圧瞮によっお品質が倱われないようにするこずができたす。 プロゞェクト内の画像の暙準名は、名前ず拡匵子の2぀の郚分で構成されおいたす。 このような画像は、100のスケヌルの画像ずしお認識されたす。 名前ず拡匵子の間に「.scale-xxx」xxxはスケヌリング係数を远加するず、このスケヌルの画面ではデフォルトで考慮され、残りの郚分で䌞瞮したすスケヌルのバヌゞョンがない堎合。 たずえば、スケヌルが200の堎合、スプラッシュスクリヌンのむメヌゞ名は「SplashScreen.scale-200.png」になりたす。 さらに本文では、将来の蚘事で予定されおいるテヌマを耇補しないように、100のスケヌルの画像のみを怜蚎したす。



ここで、画像のサむズに぀いお盎接説明したす。 アプリケヌションのすべおの基本的な芖芚的リ゜ヌスには、各スケヌルのサむズが固定されおいたす。 暙準スケヌルのスプラッシュ画面の画像は、620x300ピクセルのサむズにする必芁がありたす。 別のサむズを䜿甚しようずするず、゚ラヌに関する譊告が衚瀺されたすが、䞊蚘のスクリヌンショットを芋るず、明らかに異なるサむズの正方圢の画像を芋るこずができたす。 実際、620x300ピクセルのサむズもあり、そのほずんどが透明です。これは犁止されおいないだけでなく、倚くのシナリオで掚奚されおいたす。



スプラッシュ画面の背景色には、デフォルトのシステム色、たたはアプリケヌションマニフェストで指定した色が䜿甚されたす。







背景の色の蚭定ず独自の画像の遞択は、「スクリヌンセヌバヌ」サブセクションの「ビゞュアルリ゜ヌス」タブのマニフェスト゚ディタヌりィンドりで実行されたす。 前の蚘事で述べたように、オブゞェクトブラりザヌでPackage.appxmanifestファむルをダブルクリックするず、マニフェスト゚ディタヌを開くこずができたす。 この゚ディタヌはUWPプラットフォヌムず䞀緒に開発されおおり、VSの最新バヌゞョンでは、異なるスケヌルで1぀の画像から必芁なすべおのバリ゚ヌションをすばやく䜜成できるツヌルがありたすが、このツヌルに぀いおは別の蚘事で個別に説明したすが、ここでは手動のパラメヌタヌ蚭定のみを怜蚎したす。



最初のフィヌルド「Background screen saver」では、 HTML HEX圢匏で背景色を指定する必芁がありたす。 ほずんどすべおの画像゚ディタヌPaint 3Dを含むたたはオンラむンで適切な圢匏で色の倀を取埗できたすが、英数字の倀の先頭に「」蚘号を付ける必芁があるこの色の蚘述芏則を忘れないでください。 たずえば、私のスクリヌンセヌバヌは、背景ずしお倀 "fae57a"を䜿甚したす。







2番目のスクリヌンセヌバヌでは、むメヌゞファむルのストレヌゞフォルダヌずベヌス名を指定するよう求められたす。 「SplashScreen」の名前が必須ではないように、「Assets」フォルダヌは画像を保存するための必須の堎所ではありたせんが、叀いプロゞェクトを転送する堎合にのみそれらを倉曎する必芁が生じる堎合がありたす。 他の堎合では、基本的な倀を䜿甚する方がはるかに簡単なので、私のプロゞェクトでは名前ずパスを倉曎しないたたにしたす。 たた、ベヌス名を指定するずきに、スケヌルの衚瀺を远加する必芁がないこずにも泚意しおください。 䞋のりィンドりで遞択するず、名前にこのようなプレフィックスが自動的に衚瀺されたす。



実際、䞋のりィンドりには、むンストヌルされおいる画像のプレビュヌず、各スケヌルの遞択甚のボタンが含たれおいたす。 たた、りィンドりの暪には、特定の瞮尺に察しお画像のサむズを瀺すヒントがありたす。 ご想像のずおり、任意の名前で適切なサむズの画像を遞択するず、指定した名前で指定されたフォルダヌに配眮され、瞮尺デヌタが远加されたす。

背景色ず画像を遞択したら、アプリケヌションを起動しお、倉曎の結果を確認できたす。







これで、暙準のスプラッシュスクリヌンの準備ができたした。次は、高床なバヌゞョンの䜜成に進みたす。 前述したように、より耇雑なプログラムでは、スクリヌンセヌバヌの暙準むメヌゞの代わりに、ダりンロヌドステヌタスのスクリヌンセヌバヌが衚瀺されたす。 拡匵されたUWPスプラッシュスクリヌンは同じ機胜を実行したすが、開始時に長いタスクがある堎合にのみ䜿甚するのが理にかなっおいたす。 私のアプリケヌションでは、これらのタスクには、保存のロヌド、倉曎の初期蚈算、ネットワヌク䞊のデヌタベヌスぞのアクセス、賌入の確認が含たれたす。 異なるデバむスでは、これらすべおのタスクに異なる時間がかかりたす。珟時点で匱いデバむスでは、ナヌザヌがアプリケヌションがハングしなかったこずをナヌザヌが理解しおいるず䟿利です。



ドキュメンテヌションで修正された「拡匵スプラッシュスクリヌン」ずいう名前にもかかわらず、実際には、ロヌドむンゞケヌタヌを远加しおスプラッシュスクリヌンをシミュレヌトする自己䜜成ペヌゞを扱いたす。いずれの堎合も、䞊蚘で調べた暙準スクリヌンの衚瀺が先行したす。 。 その結果、拡匵スクリヌンセヌバヌはほずんどの郚分で暙準を繰り返し、暙準の埌に最もスムヌズに衚瀺されるはずです。



蚭蚈の芳点から芋るず、この段階は非垞に重芁であり、想像力に応じお、アプリケヌションの認識に倧きな圱響を䞎える非垞に興味深く魅力的なスクリヌンセヌバヌを䜜成できたす。そのため、この手順を過小評䟡せず、次のような平凡なダりンロヌドむンゞケヌタヌに限定しおくださいProgressRing。



少し考えお、ミルのブレヌドを回転させ、負荷の珟圚の状態を衚瀺するテキスト行を远加するこずにより、負荷衚瀺を実装するこずにしたした。 したがっお、蚈画どおり、暙準画面は静かに拡匵画面に倉わり、ブレヌドが回転し始め、テキストが䞋に衚瀺されたす。 しかし、この問題の最初のステップを螏むず、利甚可胜な資料が問題を完党にカバヌしおおらず、それらのいく぀かは最も成功した「クランチ」ではなく䜿甚されおいるずいう結論に達したした。



以䞋では、ネットワヌク䞊の蚘事ず公匏ガむドに基づいお、スプラッシュスクリヌンを䜜成するための独自のレシピを説明したすが、それでもそれらは異なりたす。



ステップ1.空癜のペヌゞを䜜成する



䞊で述べたように、拡匵スプラッシュスクリヌンは通垞のアプリケヌションペヌゞであり、基本的なスプラッシュスクリヌンにできるだけ類䌌したものにしたす。 プロゞェクトに新しいペヌゞを远加するには、[プロゞェクト]> [新しいアむテムの远加]メニュヌに移動し、衚瀺されるダむアログで[空癜ペヌゞ]アむテムを遞択したす。 公匏ドキュメントでは、このペヌゞの名前ずしお「ExtendedSplash」を䜿甚するこずをお勧めしたす。他の名前を自由に遞択できたすが、これには客芳的な理由はありたせん。 提案された名前を瀺し、「远加」をクリックしたす。



新しく䜜成されたペヌゞは2぀のファむルで構成されたす。1぀はExtendedSplash.xamlをマヌクするためのもので、もう1぀はコヌドExtendedSplash.xaml.cs / vbのためのものです。 少し埌でそれらに戻りたすが、今のずころは次のステップです。



手順2. ExtendedSplashを開始ずしお割り圓おる



公匏ガむドでは、この手順は最埌に行われたすが、事前に行うこずを奜みたす。 実際のずころ、囜を远加しおシステムスプラッシュ画面のすぐ埌ろに衚瀺するだけでは䞍十分であるため、 App.xaml.cs / vbファむルでいく぀かの操䜜を実行する必芁がありたす。



前の蚘事で思い出したように、これはそのラむフサむクルを担圓するメむンアプリケヌションファむルです。 特に、OnLaunchedプロシヌゞャがありたす。このプロシヌゞャは、アプリケヌションの起動時にすぐに実行され、開始ペヌゞが蚭定されたす。



新しいプロゞェクトVB.NETを䜜成した盎埌のこの手順のコヌドは次のずおりです。



Protected Overrides Sub OnLaunched(e As Windows.ApplicationModel.Activation.LaunchActivatedEventArgs) Dim rootFrame As Frame = TryCast(Window.Current.Content, Frame) If rootFrame Is Nothing Then rootFrame = New Frame() AddHandler rootFrame.NavigationFailed, AddressOf OnNavigationFailed If e.PreviousExecutionState = ApplicationExecutionState.Terminated Then End If Window.Current.Content = rootFrame End If If e.PrelaunchActivated = False Then If rootFrame.Content Is Nothing Then rootFrame.Navigate(GetType(MainPage), e.Arguments) End If Window.Current.Activate() End If End Sub
      
      





コヌドを枛らすために、コメントは削陀されたした。



この手順で䜕が起こっおいるかを完党に理解するには、アプリケヌションのラむフサむクルずナビゲヌションをより深く理解する必芁がありたすが、これに぀いおは次のいずれかの蚘事で説明したす。 これたでのずころ、このコヌドから理解する必芁があるのは、最初にアプリケヌションのコンテンツビゞュアルルヌトずしお蚭定されるFrameオブゞェクトを䜜成し、次にこのフレヌムがアプリケヌションのMainPageペヌゞに移動するこずです。



ここでは、MainPageの代わりにExtendedSplashを蚭定する必芁があるず想定するのが論理的です。開始ペヌゞずしお目的のペヌゞを取埗したすが、この堎合、ExtendedSplashペヌゞはナビゲヌション履歎に保存され、戻るこずができるため、このオプションは適しおいたせん。これは必芁ありたせん。 この問題を解決するには、ナビゲヌトするのではなく、アプリケヌションコンテンツをフレヌムではなく、ExtendedSplashに盎接蚭定したす。これは、Pageオブゞェクトですが、アプリケヌションの芖芚的なルヌトにもなりたす。



コヌドを次のように修正したす。



 Protected Overrides Sub OnLaunched(e As Windows.ApplicationModel.Activation.LaunchActivatedEventArgs) Dim rootFrame As Frame = TryCast(Window.Current.Content, Frame) If rootFrame Is Nothing Then rootFrame = New Frame() AddHandler rootFrame.NavigationFailed, AddressOf OnNavigationFailed If (e.PreviousExecutionState <> ApplicationExecutionState.Running) Then Window.Current.Content = New ExtendedSplash(e.SplashScreen) End If End If If e.PrelaunchActivated = False Then If rootFrame.Content Is Nothing Then rootFrame.Navigate(GetType(MainPage), e.Arguments) End If Window.Current.Activate() End If End Sub
      
      





お気づきのように、コヌドブロックは最初の条件で倉曎されたした。 このブロックの䞋郚で、アプリケヌションが実行されおいるかどうかを確認し、実行されおいない堎合は、新しいExtendedSplashペヌゞオブゞェクトがアプリケヌションコンテンツずしお割り圓おられたす。



たた、パラメヌタヌずしお、新しいExtendedSplashクラスを宣蚀するずきに、SplashScreenクラスが指定されたす。 このクラスは、スプラッシュスクリヌン䞊の画像のサむズず䜍眮に関する情報を含むため、拡匵スプラッシュスクリヌンを䜜成する重芁な郚分です。これにより、ベヌススクリヌンを静かに独自のものに眮き換えるこずができたす。 このクラスに必芁なデヌタが含たれるように、OnLaunchedプロシヌゞャがシステムから受け取った匕数から取埗したす。



最埌の仕䞊げがありたす。 コヌドファむル拡匵子ExtendedSplash.xaml.cs / vbで、SplashScreen型のオブゞェクトを受け入れるNewコンストラクタヌを远加する必芁がありたす。



  Public Sub New(splashscreen As SplashScreen) InitializeComponent() End Sub
      
      





これで、アプリケヌションが起動するず、MainPageではなくExtendedSplashペヌゞが衚瀺されたす。これにより、ペヌゞレむアりトに加えられた倉曎をすぐに確認でき、コヌドをデバッグする方が䟿利です。



ステップ3.ペヌゞレむアりト



ExtendedSplashペヌゞのレむアりトにおける最初の最も簡単な倉曎は、ペヌゞの背景色をメむンのスプラッシュ画面ず同じ色に蚭定するこずです。 新しく䜜成されたペヌゞには、背景プロパティを持぀グリッドルヌト芁玠が既に含たれおいたす。 デフォルトでは、このプロパティはシステムリ゜ヌスを蚭定したすが、以前はアプリケヌションマニフェストで指定されおいた色に眮き換えたす。 原則ずしお、色の倀は盎接のBackground = "fae57a"を指すこずができたすが、アプリケヌションのメむンカラヌは特別なファむルApplicationStyle.xamlに保存したす 。これに぀いおは、前の蚘事の最埌で説明したした。 背景のリ゜ヌスは「BackgroundBrush」ず呌び、適切な堎所で参照したす。



スタむルリ゜ヌスファむル



 <SolidColorBrush x:Key="BackgroundBrush" Color="#fae57a"/>   ExtendedSplash.xaml: <Grid Background="{StaticResource BackgroundBrush}"

      
      





そしお最埌に、私たちの方法ず公匏ガむドや他の蚘事に蚘茉されおいる方法ずの䞻な違いが始たる堎所に着きたした。



公匏ドキュメントの蚘事を既に孊習しおいる堎合は、Canvas芁玠を䜿甚しお画像をペヌゞに配眮するこずを提案しおいるこずに気づきたした。 画像をサむズだけでなく䜍眮も蚭定できるようにする必芁がありたすが、実際には、すべおが期埅どおりに完党に移動するわけではありたせん。



マニュアルの䜜成者は、スプラッシュ画面の画像は状況によっお異なる方法で拡倧瞮小できるずいう事実から進んでいたす。 その理由は、さたざたなデバむスのスケヌリング係数ず、PCのりィンドりのサむズの䞡方である可胜性がありたす。 これらのすべおの状況でのベヌスむメヌゞの動䜜はシステムによっお芏制されおおり、この動䜜をシミュレヌトできるように、前述のSplashScreenクラスが提䟛されたす。このクラスの唯䞀のプロパティはRect型のImageLocationです。 このプロパティには、画像のサむズ幅、高さず䜍眮X、Yに関する情報が含たれおいたす。したがっお、利甚可胜なデヌタに基づいお画像を操䜜するには、Canvas芁玠が適切であり、そのようなパラメヌタヌに基づいおオブゞェクトを操䜜するこずが適切です。



実際、掚奚されるように拡匵スクリヌンセヌバヌを実装するず、すべおが機胜したすが、PCでのみ機胜したす。 電話でアプリケヌションを実行するず、完党に予枬䞍可胜な倉身が起こり始めたす。 画像が衚瀺されないか、正しく衚瀺されたせん。 画面を氎平䜍眮で回転させるず、画像は画面の端たで逃げ、郚分的に切り取られ、垂盎䜍眮に戻ったずきにのみ適切な堎所に移動したす。



ネットワヌク䞊での倚くの議論ず、修正が掚奚されおいる蚘事から刀断するず、同様の問題に遭遇したのは私だけではないず結論付けるこずができたす。 私が芋぀けた最も人気のある゜リュヌションは、デバむスごずに異なるマヌクアップを䜿甚するこずをお勧めしたす。 PC甚のキャンバスずモバむル甚のグリッド。 この決定を完党に繰り返しお、コンパヌトメントに実行可胜なスプラッシュスクリヌンが衚瀺され、過剰な束葉杖を䜿甚しおいるず匷く感じたした。



最終的に、基本画面で正確に䜕が起こっおいるのか、それをどの皋床シミュレヌトする必芁があるのか​​を個別に把握するこずにしたした。 さたざたなデバむスず゚ミュレヌタヌでの䞀連の実隓の結果、むメヌゞの䜍眮に関する情報を完党に攟棄できるこずに気付きたした。 りィンドりのサむズ、デバむスのタむプ、たたはその向きに関係なく、メむンのスプラッシュ画面の画像は垞に画面の䞭倮に衚瀺されたす。 したがっお、画像のサむズに関する情報のみを抜出でき、基本画面を簡単に繰り返すこずができたす。



最初の段階での私のりィンドりレむアりトは次のようになりたす。



 <Grid Background="{StaticResource BackgroundBrush}"> <Image x:Name="SplashScreenImage3" Source="Assets/SplashScreens/SplashScreen3.png" Canvas.ZIndex="3" HorizontalAlignment="Center" VerticalAlignment="Center"/> <Image x:Name="SplashScreenImage2" Source="Assets/SplashScreens/SplashScreen2.png" Canvas.ZIndex="2" HorizontalAlignment="Center" VerticalAlignment="Center"/> <Image x:Name="SplashScreenImage1" Source="Assets/SplashScreens/SplashScreen1.png" HorizontalAlignment="Center" VerticalAlignment="Center"/> <TextBlock x:Name="LoadingSatatusTextBox" HorizontalAlignment="Center" VerticalAlignment="Bottom" Margin="0,0,0,20" TextAlignment="Center" Foreground="{StaticResource ForegroundBrush}" FontWeight="Bold"/> </Grid>
      
      





分析を始める前に、初心者の開発者に連絡したいず思いたす。 XAMLマヌクアップ蚀語を初めお䜿甚する堎合は、りィンドりデザむナヌコンストラクタヌずも呌ばれるでの䜜業をできる限り少なくするこずを匷くお勧めしたす。 Visual Studioの新しいバヌゞョンごずに改善されおいたすが、䟝然ずしお䞍正確なツヌルです。 たずえば、Imageコントロヌルをペヌゞにドラッグするず、䞭倮に配眮したように芋える堎合がありたすが、実際には、垂盎および氎平䜍眮のプロパティではなく、むンデントに基づいお配眮を蚭定できたす。 マヌクアップでは、2぀のプロパティHorizo​​ntalAlignmentおよびVerticalAlignmentを陀き、画像の䜍眮に圱響を䞎えるむンデントやその他の芁因を陀倖するこずが非垞に重芁です。



しかし、マヌクアップに戻りたす。 ゚ラヌなしで機胜するためには、Image芁玠の゜ヌスずしお䜿甚されるプロゞェクトに画像ファむルを远加する必芁がありたす。 「SplashScreens」フォルダヌ「Assets」のサブフォルダヌに配眮したした。 プロゞェクトに画像を远加するには、目的のフォルダヌを右クリックしお、メニュヌ項目「远加>既存の項目...」を遞択したす。 静止芁玠ず移動芁玠を分離する必芁があるため、3぀の画像がありたす。







最初の画像ず3番目の画像は基本620x300ピクセル暙準瞮尺ず同じサむズであり、3番目の画像には画像党䜓ず同じ堎所にアむコンが含たれ、残りの郚分は透明であるこずに泚意するこずが重芁です。 これは、互いの盞察的な配眮にかかる劎力を最小限に抑えるために行われたす。 ブレヌドの画像ぱッゞの䞋でトリミングされ、䜙分なセクションはありたせん。



3぀の画像はすべお、ペヌゞの䞭倮に厳密に配眮されたす。 この䟋では、グリッド芁玠の䞭心ですが、ペヌゞのルヌト芁玠であり、むンデントがないため、その䞭心はペヌゞの䞭心に等しくなりたす。 次に、ブレヌドがミルの背埌にあるずいう状況にならないように、重なり合う画像の正しい順序を蚭定する必芁がありたす。 これを行うにはCanvas.ZIndexプロパティを䜿甚したす。Image芁玠がマヌクアップに配眮される順序は関係ありたせんが、このプロパティの倀のみが重芁です。 倀が高いほど、芁玠の重なりが倧きくなりたすZ軞。



マヌクアップの最埌の芁玠は、ダりンロヌドステヌタスを衚瀺するテキストブロックです。 これは、氎平面に察しお䞭倮にあり、比范的垂盎の䞋にありたす。 たた、テキストが画面の端に「くっ぀かない」ように、䞋から小さなむンデントが瀺されおいたす。 さらに2぀のプロパティがテキストの色ずスタむルを瀺したす。



テキストの色のリ゜ヌスは次のように蚭定されたす。



 <SolidColorBrush x:Key="ForegroundBrush" Color="#c89103"/>
      
      





この時点で、マヌキングを䜿甚した䜜業の最初の段階は完了したず芋なすこずができたすが、ブレヌドの回転アニメヌションを远加するずきにその段階に戻りたす。



ステップ4.ペヌゞコヌド



䜜業の最も重芁な郚分は、ファむルExtendedSplash.xaml.cs / vbにあるペヌゞコヌドで行われたす。



最初のステップは、Windows.UI.Core名前空間をむンポヌトし、埌のコヌドで必芁になる倉数を远加するこずです。



 Imports Windows.UI.Core Public NotInheritable Class ExtendedSplash Inherits Page Friend splashImageRect As Rect Private splash As SplashScreen Friend ScaleFactor As Double Public Sub New(splashscreen As SplashScreen) InitializeComponent() End Sub End Class       : Public Sub New(splashscreen As SplashScreen) InitializeComponent() AddHandler Window.Current.SizeChanged, AddressOf ExtendedSplash_OnResize splash = splashscreen If splash IsNot Nothing Then AddHandler splash.Dismissed, AddressOf DismissedEventHandler ScaleFactor = DisplayInformation.GetForCurrentView().RawPixelsPerViewPixel splashImageRect = splash.ImageLocation SetSizeImage() End If End Sub
      
      





コヌドは、ルヌトコンテナヌのサむズ倉曎むベントにサブスクラむブするこずから始たりたす。 これは、りィンドりサむズたたはデバむスの向きが倉曎されたずきに画像サむズを倉曎するために必芁になりたす。 次に、匕数で枡されたSplashScreenクラスがロヌカル倉数に転送されたす。ロヌカル倉数は、必芁な画像サむズに関する情報を参照したす。



空でないはずのロヌカルスプラッシュ倉数を確認した埌、さらに操䜜を進めたす。 これで、システムスプラッシュ画面が閉じたずきに発生するDismissedむベントにサブスクラむブできたす。 この点は、スプラッシュスクリヌンの䞀般的な原理を理解するために重芁です。 実際、コヌドがNewプロシヌゞャ内で実行されおいる間、ペヌゞはただ初期化䞭で衚瀺の準備ができおいたせん。したがっお、基本的なスプラッシュ画面はアプリケヌションを「保護」し、実行䞭ず目的のペヌゞが衚瀺されるこずを瀺したす。 倚くの点で、静的なパッチではなく、長時間の初期化プロセスがラむブ芖芚化に䌎うように、拡匵スプラッシュ画面が必芁な理由です。



コヌドの次の行は、サむズを正しく解釈するために珟圚のスケヌリング係数を保存し、サむズ自䜓はさらにコヌドの倉数splashImageRectに栌玍されたす。 そしお最埌に、最埌の行がプロシヌゞャを呌び出し、受信したすべおのデヌタを操䜜したす。



もちろん、このコヌドを远加するず、䞊蚘のむベントが関連付けられおいるプロシヌゞャがなく、SetSizeImageプロシヌゞャも存圚しないため、3぀の゚ラヌメッセヌゞが衚瀺されたす。



それらを远加したす。



 Private Sub SetSizeImage() End Sub Private Sub DismissedEventHandler(sender As SplashScreen, args As Object) End Sub Private Sub ExtendedSplash_OnResize(sender As Object, e As WindowSizeChangedEventArgs) End Sub           SetSizeImage: Private Sub SetSizeImage() SplashScreenImage1.Height = splashImageRect.Height / ScaleFactor SplashScreenImage1.Width = splashImageRect.Width / ScaleFactor SplashScreenImage2.Width = splashImageRect.Width / ScaleFactor * 0.3073 SplashScreenImage2.Margin = New Thickness(-splashImageRect.Width / ScaleFactor * 0.547, -splashImageRect.Width / ScaleFactor * 0.1633, 0, 0) SplashScreenImage3.Height = splashImageRect.Height / ScaleFactor SplashScreenImage3.Width = splashImageRect.Width / ScaleFactor ScaleFactor = 1 End Sub
      
      





このコヌドは、ペヌゞに配眮される各画像のサむズを順番に蚭定したす。 1番目ず3番目の画像の堎合、画像の幅ず高さをSplashScreenクラスから削陀したものに等しく蚭定し、スケヌリング係数を調敎するだけで十分です。 ScaleFactor倉数の最埌の行が1に蚭定されおおり、このプロシヌゞャを再床呌び出すず、スケヌリング係数の調敎が実際に行われないこずに泚意しおください。 これは、公匏ガむドの゜リュヌションがモバむルで機胜しないのず同じ問題によるものです。 䜕らかの理由で、SplashScreenクラスは、最初にスケヌリング係数を考慮に入れお画像のサむズを通知し、デバむスの回転などのさらなる操䜜なしで衚瀺されたす。 そのため、初期化䞭に、この係数は最初の操䜜のために保存され、それ以降の係数では1にリセットされたす。



Windows 10の今埌のビルドの1぀では、この奇劙な状況が解消される可胜性があり、このコヌドを倉曎する必芁がありたすが、これたでのずころ、Fall Creators Updateたでのリリヌスされたすべおのアセンブリで正垞に動䜜したす。



別の考慮事項は、2番目の画像のサむズ蚭定です。 より正確には、その堎合、サむズを蚭定するだけでなく、䜍眮を蚭定するこずに限定されたす。なぜなら、最初はブレヌドがミル領域ではなく䞭倮にあるからです。



ちなみに、画像は正方圢であり、高さが比䟋しお同じサむズに倉曎されるため、幅など、片偎のサむズのみを蚭定するだけで十分です。 サむズを蚭定する堎合、スケヌリング係数の調敎に加えお、メむン画像に基づいおサむズも調敎したす。 より正確には、画像の幅を基準にしお、このサむズを占めるブレヌドの割合を蚈算したす。 私の堎合、0.3073です。



次に、同じロゞックに基づいお、画像党䜓の幅を基準ずしお、䞭心から目的のポむントたでの距離を蚈算したす。 次の行では、むンデントを巊に掚定距離たで蚭定したす。



アプリケヌションを起動し、この段階で結果がメむンのスプラッシュ画面ず芖芚的に倉わらないこずを確認したす。 ここで、モバむルでアプリケヌションを起動するず、ベヌスのむメヌゞに比べおむメヌゞのわずかなシフトが芋られたす。 これは、ベヌス画面が画面の䞭倮に䜍眮するため、電話の䞊郚にあるステヌタスバヌや䞀郚のモデルにある䞋郚の仮想ボタンバヌなどのむンタヌフェむス芁玠を完党に無芖するためです。 コヌドに必芁な倉曎を加えたしょう。



最初に、ステヌタスバヌの高さを栌玍する倉数を準備したす。



 Friend statusBarRect As Rect        : If Metadata.ApiInformation.IsTypePresent("Windows.UI.ViewManagement.StatusBar") Then statusBarRect = StatusBar.GetForCurrentView.OccludedRect End If
      
      





このコヌドは、䞀床に2぀の面で興味深いものです。 たず、ここで初めお、適応コヌドに盎面しおいたす。これに぀いおは、前の蚘事で説明したした。 条件の本質は、タヌゲットデバむス䞊に目的のクラスが存圚するかどうかを確認し、存圚する堎合は、条件内のコヌドが゚ラヌなしで実行されるこずです。



アダプティブコヌドにもかかわらず、StatusBarぞのアクセスは成功せず、そのようなクラスが存圚しないずいうメッセヌゞを受け取りたす。 これは、最初にUWPアプリケヌションには、操䜜なしでサポヌトされおいるすべおのデバむスで実行できる共通コヌドのみが含たれおいるためです。 特定のプラットフォヌムに固有のクラスぞのリンクは個別に远加されたす。 ステヌタスバヌはモバむルデバむスに固有であるため、最初に目的のクラスラむブラリぞのリンクを远加する必芁がありたす。 [プロゞェクト]> [リンクの远加...]メニュヌに移動したす。 巊偎に「ナニバヌサルりィンドり」セクションずサブセクション「拡匵機胜」がありたす。 ラむブラリのリストで「UWP甚のWindows Mobile拡匵機胜」ラむブラリを芋぀け、アプリケヌションの最小バヌゞョンに等しいバヌゞョンを遞択したす。



これで、䞊蚘のコヌドぱラヌなしで機胜したす。 より正確には、モバむルでのみ動䜜し、他のすべおのデバむスでは無芖されたす。



最埌に、䜍眮決めず画像サむズの蚭定コヌドを修正したす。



 Private Sub SetSizeImage() SplashScreenImage1.Height = splashImageRect.Height / ScaleFactor SplashScreenImage1.Width = splashImageRect.Width / ScaleFactor SplashScreenImage1.Margin = New Thickness(0, -statusBarRect.Height, 0, 0) SplashScreenImage2.Width = splashImageRect.Width / ScaleFactor * 0.3073 SplashScreenImage2.Margin = New Thickness(-splashImageRect.Width / ScaleFactor * 0.547, -splashImageRect.Width / ScaleFactor * 0.1633 - statusBarRect.Height, 0, 0) SplashScreenImage3.Height = splashImageRect.Height / ScaleFactor SplashScreenImage3.Width = splashImageRect.Width / ScaleFactor SplashScreenImage3.Margin = New Thickness(0, -statusBarRect.Height, 0, 0) ScaleFactor = 1 End Sub
      
      





远加されたコヌドは、各画像をステヌタスバヌの高さず等しいサむズだけ䞊方にシフトしたす。アプリケヌションが任意のデバむスで起動されるず、画像は基本画像ず同じ堎所に配眮されたす。 残念ながら、この゜リュヌションはただ完党ではありたせん。 䞀郚の電話モデルにはハヌドりェアボタンがなく、代わりに電話コントロヌルボタンが電話自䜓の仮想パネルに配眮されおいるため、同じシフト効果が発生し、怜玢しなかったため、このパネルの高さを取埗する堎所に関する情報が芋぀かりたせんでした。たた、䞀般的に、必芁な倉曎を行うために、その存圚たたは䞍圚に関する情報を受信したす。 この情報がある堎合は、コメントで必ず共有しおください。



必芁な調敎がすべお行われたので、りィンドりのサむズ倉曎たたはデバむスの向きに察する反応を远加する必芁がありたす。



 Private Sub ExtendedSplash_OnResize(sender As Object, e As WindowSizeChangedEventArgs) If splash IsNot Nothing Then splashImageRect = splash.ImageLocation SetSizeImage() End If End Sub
      
      





ここではすべおが非垞に簡単です。 SplashScreenクラスを栌玍するオブゞェクトが空かどうかを確認し、空でない堎合はサむズ情報を削陀しおから、SetSizeImageプロシヌゞャを繰り返したす。



. , . , - , DismissedEventHandler. , . :



 Private Async Sub DismissedEventHandler(sender As SplashScreen, args As Object) Await Dispatcher.RunAsync(CoreDispatcherPriority.Normal, New DispatchedHandler(AddressOf DismissExtendedSplash)) End Sub
      
      





DismissExtendedSplash , . , Async Await, . : Await , , . Await / /, Async.



DismissExtendedSplash, :



 Private Async Sub DismissExtendedSplash() LoadingSatatusTextBox.Text = " ..." Await Task.Delay(New TimeSpan(0, 0, 15)) Dim rootFrame As New Frame rootFrame.Navigate(GetType(MainPage)) Window.Current.Content = rootFrame End Sub
      
      





. , , . . , 15 . , 15 , .



, Frame, . , .

: , 15 .



5.



, , «». .



XAML :



 <Grid Background="{StaticResource BackgroundBrush}"> <Grid.Resources> <Storyboard x:Name="ImageRotateAnimation"> <DoubleAnimation Storyboard.TargetName="ImageRotate" Storyboard.TargetProperty="Angle" To="360" BeginTime="0:0:0.5" Duration="0:0:5" RepeatBehavior="Forever"/> </Storyboard> </Grid.Resources> <Image x:Name="SplashScreenImage3" Source="Assets/SplashScreens/SplashScreen3.png" Canvas.ZIndex="3" HorizontalAlignment="Center" VerticalAlignment="Center"/> <Image x:Name="SplashScreenImage2" Source="Assets/SplashScreens/SplashScreen2.png" Canvas.ZIndex="2" HorizontalAlignment="Center" VerticalAlignment="Center" RenderTransformOrigin="0.5 0.5"> <Image.RenderTransform> <RotateTransform x:Name="ImageRotate" Angle="0"/> </Image.RenderTransform> </Image> <Image x:Name="SplashScreenImage1" Source="Assets/SplashScreens/SplashScreen1.png" HorizontalAlignment="Center" VerticalAlignment="Center"/> <TextBlock x:Name="LoadingSatatusTextBox" HorizontalAlignment="Center" VerticalAlignment="Bottom" Margin="0,0,0,20" TextAlignment="Center" Foreground="{StaticResource ForegroundBrush}" FontWeight="Bold"/> </Grid>
      
      





. -, 0 . , .



-, Storyboard, Double. Double . . , .



, . New :



ImageRotateAnimation.Begin







, , .







.



, , , .



All Articles