Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
NativeアプリをXamarin.Formsに移植してみた話
Search
Masaaki Yoshida
May 07, 2016
Technology
0
3.8k
NativeアプリをXamarin.Formsに移植してみた話
2016年5月7日にJapan Xamarin User Group Conference #13でお話ししたスライドです。
Masaaki Yoshida
May 07, 2016
Tweet
Share
Other Decks in Technology
See All in Technology
BDD(Cucumber)コミュニティが無料提供しているコンテンツの紹介と現在起きている危機
nihonbuson
4
720
KTC_DBRE.pdf
_awache
0
280
WebXR で Web をもっと楽しもう
qst_exe
0
110
なんで私に登壇依頼が?! ~頼られるエンジニアになるためには~ /
mixi_engineers
PRO
2
190
LLMプロダクト事業の立ち上げにおける挑戦
layerx
PRO
7
1.4k
2023 Japan AWS Jr.Championsに選出されての振り返りとこれから
hiropy877
1
130
AMLD 2024 - Build Your Own GPT
donlelef
1
260
オーティファイ会社紹介資料 / Autify Company Deck
autifyhq
7
100k
GitHub最新情報キャッチアップ 2024年3月
dzeyelid
16
3.1k
技術イベントはなんとかひねり出す 日経の技術広報の取り組み/techpr3
nishiuma
0
220
「XX試験の環境作ってよ」と言われた時によく使うAWSのソリューションについて
bun913
0
120
現実世界の事象から学ぶSOLID原則
h0r15h0
24
9.3k
Featured
See All Featured
The Invisible Customer
myddelton
114
12k
Building Flexible Design Systems
yeseniaperezcruz
317
37k
Six Lessons from altMBA
skipperchong
19
2.9k
Design and Strategy: How to Deal with People Who Don’t "Get" Design
morganepeng
113
18k
Unsuck your backbone
ammeep
660
56k
Dealing with People You Can't Stand - Big Design 2015
cassininazir
355
22k
Embracing the Ebb and Flow
colly
78
4.1k
Typedesign – Prime Four
hannesfritz
36
2k
Writing Fast Ruby
sferik
619
59k
jQuery: Nuts, Bolts and Bling
dougneiner
57
7.1k
Easily Structure & Communicate Ideas using Wireframe
afnizarnur
185
15k
YesSQL, Process and Tooling at Scale
rocio
160
13k
Transcript
NativeΞϓϦΛ Xamarin.FormsʹҠ২ͯ͠Έͨ 20165݄7 ઌٕज़ࣄۀ෦ εϚʔτιϦϡʔγϣϯηϯλʔ ٢ాক໌ Xamarin User Group Conference
#13
All Rights Reserved. Copyright © CRESCO LTD. 2 ࣗݾհ ٢ాক໌ʢΑͩ͠
·͖͋͞ʣ ܦྺ ࢈ۀܥSE→ࠂཧళ Ӧۀˠݱࡏ .NETɺC#͔ͬΓͬͯͨࢲɻ͍͖ͳΓεϚϗܥͷ෦ॺʹɻ →ϠόΠɺ͓ݺͼͰͳ͍ɻɻɻ Xamarinͷग़ձ͍ ͦΜͳதɺ2014/5/29,30ʹߦΘΕͨde:codeʹࢀՃ →࣌XamarinΤόͩͬͨล༑ଠ͞ΜͷxamarinηογϣϯΛௌߨ →C#ͰεϚϗ࡞ΕΔΜͩʂʂ͔͠ΫϩεϓϥοτϑΥʔϜɻ →ࣾͰܒ׆ಈΛ։࢝ →΄ͲࣾษڧձΠϕϯτͰܒ׆ಈΛͨ݁͠Ռɻɻɻ
Xamarin.FormsͰ ΈΜͳͰͯΜ͜ʂ 201510݄3 ٢ా ক໌ ୈ̒ճ Japan Xamarin User Group
Conference @౦ژ ઌٕज़ࣄۀ෦
All Rights Reserved. Copyright © CRESCO, LTD. 4 ʮΈΜͳͷͯΜ͜ʯͷ͘͠Έ αʔόʔ
18 ɹ/20 50 45 ใরձʗ࿈བྷࢦࣔ Bluetooth πΞʔࢀՃऀใऔಘ Ի௨ SMS σʔλೖྗ πΞʔࢀՃऀ ఴһ Ϗʔίϯόοδ ݺઐ༻ iPadΞϓϦ πΞʔཧऀ
All Rights Reserved. Copyright © CRESCO LTD. 5 ΈΜͳͷͯΜ͜ͷཪଆΛͬͱΓ͍ͨํ SlideShareͰެ։த
http://www.slideshare.net/ma-yoshida/xamarinforms-53721105
All Rights Reserved. Copyright © CRESCO LTD. 6 ΫϨείͷIoTͷऔΓΈΛͬͱΓ͍ͨํ ΫϨείͷIoTಛઃαΠτʂ
http://service.cresco.co.jp/iot/
All Rights Reserved. Copyright © CRESCO LTD. 7 ࠓͷຊ ͢Ͱʹ͋ΔiOSɺAndroidωΟςΟϒͰ
࡞ΒΕͨΞϓϦΛXamarin.FormsʹҠ২ ͢Δ࣮ͬͯࡍͷͱ͜ΖɺͲ͏ͳͷʁ
All Rights Reserved. Copyright © CRESCO LTD. 8 Ξϓϩʔν iOS,Android͚ͷି݅ݕࡧΞϓϦΛ
Xamarin.FormsʹҠ২ͯ͠Έ·ͨ͠
All Rights Reserved. Copyright © CRESCO LTD. 9 ି݅ݕࡧΞϓϦͷXamarin.FormsԽ ը໘ߏ
ɾτοϓϖʔδ ɾࢢொଜҰཡϖʔδ ɾ݅Ұཡϖʔδ ɾ݅ৄࡉϖʔδ ɾMAPϖʔδ
All Rights Reserved. Copyright © CRESCO LTD. 10 τοϓϖʔδ iOS൛ͱAndroid൛ͰUI༷͕ҟͳΔɻ
ᶃϝχϡʔ ɹiOSɿλϒόʔίϯτϩʔϧͰը໘Լ෦ʹɻ ɹAndroidɿϋϯόʔΨʔϝχϡʔͰը໘্෦ʹɻ ᶄهจݴ ɹiOSɿ͋Γ ɹAndroidɿͳ͠ ᶃ ᶃ ᶄ Google͞ΜϋϯόʔΨʔϝχϡʔ͕ େ͖ͰɺApple͞Μ৹͕ࠪݫ͘͠ ಠࣗରԠ͕ඞཁͳΜͯ͜ͱ Α͋͘Δ͓ ͊͞Ͳ͏͠Α͏ɻ
All Rights Reserved. Copyright © CRESCO LTD. 11 τοϓϖʔδ<ϝχϡʔ> Xamarin.Formsͷඪ४ίϯτϩʔϧʹTabbedPage͕͋Δ
iOS͍͍ײ͡ ϋϯόʔΨʔϝχϡʔɾɾɾ Xamarin.Formsඪ४ίϯτϩʔϧͰ ༷Λຬͨͤͳ͍߹ɺ࣮ෆՄೳʁ ͦΜͳ͜ͱ͋Γ·ͤΜɻ ϓϥοτϑΥʔϜ͝ͱʹ ݸผUIΛ࣮ݱ͢Δํ๏ͱͯ͠ɺ Custom Renderer͕༻ҙ͞Ε͍ͯ·͢ɻ
All Rights Reserved. Copyright © CRESCO LTD. 12 τοϓϖʔδ<Custom Rendererͷ࣮ྫ>
<ContentPage.Content> ɹɹ<StackLayout Spacing="0" Padding="0" BackgroundColor="#EEEEEE"> ɹɹɹɹ<ContentView VerticalOptions="Start" > ɹɹɹ<local:HamburgerMenuView /> ɹ</ContentView> ɹ<ContentView VerticalOptions="FillAndExpand" > ɹɹɹɹɹɹ<local:TopScrollView x:Name="MyScrollView" /> ɹ</ContentView> ɹ<ContentView VerticalOptions="End" > ɹɹ<local:GlobalMenuView /> ɹɹɹɹ</ContentView> ɹɹ</StackLayout> </ContentPage.Content> ᶃPCLଆͰViewΛఆٛ(TopPage.Xaml) ᶄViewΛ3ͭͷཁૉʹׂ ɹ1.HambugerMenuView ɹ2.TopScrollView ɹ3.GlobalMenuView ᶅiOS Custom RedererͰHambugerMenuViewΛඇදࣔʹ ᶆAndroid Custom RendererͰGlobalMenuViewΛඇදࣔʹ TopPage.Xaml
All Rights Reserved. Copyright © CRESCO LTD. 13 τοϓϖʔδ<Custom Rendererͷ࣮ྫ>
[assembly:ExportRenderer (typeof(HamburgerMenuView), typeof(HamburgerMenuView_iOS))] namespace HogeHoge.iOS { public class HamburgerMenuView_iOS : ViewRenderer<ContentView, UIView> { public HamburgerMenuView_iOS () { } /** * Delete Hamburger Menu */ protected override void OnElementChanged (ElementChangedEventArgs<ContentView> e){ base.OnElementChanged (e); if (e.OldElement != null || Element == null) { return; } e.NewElement.Content = null; } } } iOSϨϯμϦϯάΫϥεͰɺassembly:ExportRendererఆٛͰForms HamburgerMenuViewΫϥεϨϯμϦϯάޙɺiOS HamburgerMenuView_iOSΫϥεΛϨϯμϦϯά͢ΔΑ͏ʹઃఆ͠·͢ɻ OnElementChangedͰe.NewElement ͕ Forms ContentView ʹͳΓ·͢ɻ͜ͷContentʹnullΛೖ͢Δͱɺแ͢ΔΠϝʔδ ͕ফڈ͞Ε·͢ɻ Forms ϨΠΞτͰɺফڈ͢ΔContentΛแ͢ΔContentView ʹߴ͞ࢦఆ͕͋Δͱɺதফڈ͞ΕͯྖҬ͚͕ͩͬͯ͠·͍· ͢ɻফڈ͢Δίϯςϯπ͕ࣗߴ͞Λܾఆ͢ΔϨΠΞτΛ࡞͓ͯ͘͠ඞཁ͕͋Γ·͢ɻ HumburgerMenuView_iOS.cs
All Rights Reserved. Copyright © CRESCO LTD. 14 τοϓϖʔδ<Custom Rendererͷ࣮ྫ>
[assembly:ExportRenderer (typeof(GlobalMenuView), typeof(GlobalMenuView_Droid))] namespace HogeHoge.Droid { public class GlobalMenuView_Droid : ViewRenderer<ContentView, Android.Views.View> { public GlobalMenuView_Droid () { } /** * Delete Global Menu */ protected override void OnElementChanged (ElementChangedEventArgs<ContentView> e){ base.OnElementChanged (e); if (e.OldElement != null || Element == null) { return; } e.NewElement.Content = null; } } } GlobalMenuView_Droid.cs AndroidϨϯμϦϯάΫϥεͰiOSಉ༷ɺassembly:ExportRendererఆٛͰForms HamburgerMenuViewΫϥεϨϯμϦϯάޙɺ Android GLobalMenuView_DroidΫϥεΛϨϯμϦϯά͢ΔΑ͏ʹઃఆ͠·͢ɻ iOSͷΈදࣔ͢Δهจݴʹؔͯ͠ɺಉ༷ʹAndroidͷϨϯμϦϯάΫϥεͰඇදࣔʹ͍ͯ͠·͢ɻ
All Rights Reserved. Copyright © CRESCO LTD. 15 ʲTips :
Ϧιʔεͷཧʳ ɾEmbedded Resource<PCLଆʹڞ௨Ϧιʔεͱͯ͠ཧ> ϝϦοτ ϓϥοτϑΥʔϜ͝ͱʹϦιʔεΛ༻ҙ͠ͳͯ͘ྑ͍ ϏϧυΞΫγϣϯΛEmbededResource ͱͯ͠ઃఆ͢Δ σϝϦοτ ෳղ૾ʹରͯ͠ɺ֦େɺॖখͷΈରԠɻ ͍Ͳ͜Ζ ݻఆαΠζͷը૾ ը૾͕ॏཁͳཁҼͰͳ͍ΞϓϦ ɾLocal Resource<֤ϓϥοτϑΥʔϜ͝ͱʹϦιʔεΛཧ> ϝϦοτ ֤ϓϥοτϑΥʔϜͷ༷ʹଇΔ͜ͱͰɺෳղ૾ʹରԠɻ iOS : BundleResource ͱͯ͠ϦιʔεΛఆٛ͢Δ͜ͱͰɺRetina / ඇRetinaΛࣝผՄೳ AndroidɿAndroidResourceͱͯ͠ϦιʔεΛఆٛ͢Δ͜ͱͰɺෳDPʹରԠɻ σϝϦοτ ϓϥοτϑΥʔϜ͝ͱʹཧ͕ඞཁ ͍Ͳ͜Ζ ͢ͰʹiOS / AndroidͷϦιʔε͕༻ҙ͞Ε͍ͯΔ߹ ը૾͕ॏཁͳཁҼͰ͋ΔΞϓϦ
All Rights Reserved. Copyright © CRESCO LTD. 16 ʲTips :
Ϧιʔεͷཧʳ ɾEmbedded Resource<PCLଆʹڞ௨Ϧιʔεͱͯ͠ཧ> var image = Xamarin.Forms.ImageSource.FromResource ("HogeHoge.Embeded.common.k_bg_select_area_row.png"); PCLͷC#ίʔυ͔Β༻͢Δ߹ ImageSource.FromResource ( ϦιʔεID )ɻϦιʔεIDϑΝΠϧͷϓϩύςΟ͔Β֬ೝՄೳɻ XAML͔Β༻͢Δ߹ [ContentProperty ("Source")] public class ImageResource : IMarkupExtension { public string Source { get; set; } public object ProvideValue (IServiceProvider serviceProvider) { if (Source == null) return null; var imageSource = ImageSource.FromResource(Source); return imageSource; } } <Image Source="{local:ImageResource HogeHoge.Embeded.top.k_img_top.png}" /> ͦͷ··ͰXAML͔Βݺͼग़͢͜ͱ͕Ͱ͖ͳ͍͕ɺMarkup֦ுΛఆٛ͢Δͱݺͼग़ͤΔΑ͏ʹͳΔɻ ImageResource.cs
All Rights Reserved. Copyright © CRESCO LTD. <!---Bukken List -->
<ListView ɹɹx:Name="BukkenList" ɹɹHorizontalOptions="FillAndExpand"> ɹɹ<ListView.ItemTemplate> ɹɹɹ<DataTemplate> ɹɹɹɹ<ViewCell> ɹɹɹɹɹ<ViewCell.View> ɹɹɹɹɹɹ<AbsoluteLayout Padding="0"> ɹɹɹɹɹɹɹ<ContentView Padding="0" ɹɹɹɹɹɹɹɹɹAbsoluteLayout.LayoutBounds="0,0,1,1" ɹɹɹɹɹɹɹɹɹAbsoluteLayout.LayoutFlags=“All"> ɹɹɹɹɹɹɹɹ<Image Source="{Binding CellBgImage}" Aspect="Fill" /> </ContentView> <ContentView Padding="0" ɹɹɹɹɹɹɹɹɹAbsoluteLayout.LayoutBounds="0,0,1,1" ɹɹɹɹɹɹɹɹɹAbsoluteLayout.LayoutFlags=“All"> ɹɹɹɹɹɹɹ<!---Bukken View --> <StackLayout ɹOrientation="Horizontal" ɹSpacing="0" ɹPadding="5,15,0,15" ɹVerticalOptions="FillAndExpand" ɹHorizontalOptions="FillAndExpand"> ɹɹɹɹɹɹɹɹ<!---Bukken Image --> ɹ<ContentView VerticalOptions="FillAndExpand"> ɹɹ<Image Source="{Binding LeftArrowImage}" Aspect="AspectFit" /> ɹ</ContentView> ɹ<ContentView WidthRequest="60"> ɹɹ<Image Source="{Binding BukkenImage}" Aspect="AspectFit" /> ɹ</ContentView> ɹ<ContentView VerticalOptions="FillAndExpand"> ɹɹ<Image Source="{Binding RightArrowImage}" Aspect="AspectFit" /> ɹɹɹɹɹɹɹɹ</ContentView> ɾɾɾɾ 17 ݅Ұཡϖʔδ Xamarin.Formsඪ४ίϯτϩʔϧͷΈͰ࣮
All Rights Reserved. Copyright © CRESCO LTD. 18 ݅ৄࡉϖʔδ UI෦Formsඪ४ίϯτϩʔϧͷΈͰ࣮
ϓϥοτϑΥʔϜݸผ࣮ͱͯ͠ɺ ɾϝʔϧ࿈ܞػೳΛ Dependency ServiceͰ࣮ ɾి࿈ܞػೳΛ Custom RendererͰ࣮
All Rights Reserved. Copyright © CRESCO LTD. 19 ݅ৄࡉϖʔδ<ϝʔϧ࿈ܞػೳ iOS>
PCLଆʹϝʔϧػೳͷΠϯλʔϑΣʔεΛ࣮ public interface IMailOpener { void OpenMail(object context, string to, string subject, string body); } iOSଆʹDependencyServiceΛܦ༝ͯ͠ݺͼग़͞ΕΔOpenMailϝιουΛఆٛ [assembly: Dependency (typeof (MailOpener_iOS))] namespace HogeHoge.iOS { public class MailOpener_iOS : IMailOpener { public MailOpener_iOS (){} public void OpenMail(object context, string to, string subject, string body){ var escSubject = new NSString(subject); escSubject = escSubject.CreateStringByAddingPercentEscapes (NSStringEncoding.UTF8); var escBody = new NSString(body); escBody = escBody.CreateStringByAddingPercentEscapes (NSStringEncoding.UTF8); var mailUrl = string.Format("mailto://{0}?subject={1}&body={2}",to, escSubject, escBody); var url = NSUrl.FromString (mailUrl); if (UIApplication.SharedApplication.CanOpenUrl (url)) { UIApplication.SharedApplication.OpenUrl (url); } } } } PCLଆͰͷݺͼग़͠ྫ void OnMailButtonClicked(object sender, EventArgs args) { ɹɹobject context = MailButton.myContext; ɹɹDependencyService.Get<IMailOpener>().OpenMail(context, myToAddress, mySubject, myBody); }
All Rights Reserved. Copyright © CRESCO LTD. 20 ݅ৄࡉϖʔδ<ϝʔϧ࿈ܞػೳ Android>
PCLଆʹϝʔϧػೳͷΠϯλʔϑΣʔεΛ࣮ public interface IMailOpener { void OpenMail(object context, string to, string subject, string body); } AndroidଆʹDependencyServiceΛܦ༝ͯ͠ݺͼग़͞ΕΔOpenMailϝιουΛఆٛ [assembly: Dependency (typeof (MailOpener_Droid))] namespace HogeHoge.Droid { public class MailOpener_Droid : IMailOpener { public MailOpener_Droid (){} public void OpenMail(object context, string to, string subject, string body){ Intent intent = new Intent(Intent.ActionSend); intent.SetType("text/html"); intent.PutExtra(Intent.ExtraEmail,new String[]{to}); intent.PutExtra(Intent.ExtraSubject, subject); intent.PutExtra(Intent.ExtraText, body); var currentActivity = context as Activity; currentActivity.StartActivity(Intent.CreateChooser(intent, "Send Email")); } } } PCLଆͰͷݺͼग़͠ྫ void OnMailButtonClicked(object sender, EventArgs args) { ɹɹobject context = MailButton.myContext; ɹɹDependencyService.Get<IMailOpener>().OpenMail(context, myToAddress, mySubject, myBody); }
All Rights Reserved. Copyright © CRESCO LTD. 21 ݅ৄࡉϖʔδ<ి࿈ܞػೳ iOS>
PCLଆʹి࿈ܞ༻ϘλϯΫϥεΛ࡞ public class TelephoneButton : Button { ɹɹpublic TelephoneButton () ɹɹ{ ɹTextColor = Color.Blue; ɹVerticalOptions = LayoutOptions.FillAndExpand; ɹHorizontalOptions = LayoutOptions.FillAndExpand; ɹFontSize = 12; ɹɹ} } iOSଆʹΧελϜϨϯμϥʔͰϘλϯΫϦοΫ࣌ͷಈ࡞ΛΧελϚΠζ [assembly:ExportRenderer (typeof(TelephoneButton), typeof(TelephoneButton_iOS))] namespace HogeHoge.iOS { public class TelephoneButton_iOS : ButtonRenderer { public TelephoneButton_iOS (){} protected override void OnElementChanged (ElementChangedEventArgs<Xamarin.Forms.Button> e) { base.OnElementChanged (e); // ΫϦοΫ࣌ͷಈ࡞ॻ͖͑ UIButton button = this.Control; button.AddTarget (OpenTelephone, UIControlEvent.TouchUpInside); } void OpenTelephone(object sender, EventArgs args){ UIButton button = sender as UIButton; var text = string.Format("telprompt://{ 0}", button.TitleLabel.Text); var urlText = Uri.EscapeUriString (text); System.Diagnostics.Debug.WriteLine ("OpenTelephone:{0}",urlText); var url = new NSUrl (urlText); UIApplication.SharedApplication.OpenUrl (url); } } }
All Rights Reserved. Copyright © CRESCO LTD. 22 ݅ৄࡉϖʔδ<ి࿈ܞػೳ Android>
PCLଆ ి࿈ܞ༻ϘλϯΫϥε public class TelephoneButton : Button { ɹɹpublic TelephoneButton () ɹɹ{ ɹTextColor = Color.Blue; ɹVerticalOptions = LayoutOptions.FillAndExpand; ɹHorizontalOptions = LayoutOptions.FillAndExpand; ɹFontSize = 12; ɹɹ} } [assembly:ExportRenderer (typeof(TelephoneButton), typeof(TelephoneButton_Driod))] namespace HogeHoge.Droid { public class TelephoneButton_Driod : ButtonRenderer { Activity myActivity; string myDialText; public TelephoneButton_Driod (){} protected override void OnElementChanged (ElementChangedEventArgs<Xamarin.Forms.Button> e) { base.OnElementChanged (e); // ΫϦοΫ࣌ͷಈ࡞ॻ͖͑ myActivity = this.Context as Activity; myDialText = e.NewElement.Text; var button = this.Control; button.Click += OnClickButton; } void OnClickButton(object sender, EventArgs e) { var urlText = Android.Net.Uri.Parse ("tel:" + myDialText); var intent = new Intent (Intent.ActionView, urlText); myActivity.StartActivity(intent); } } } AndroidଆʹΧελϜϨϯμϥʔͰϘλϯΫϦοΫ࣌ͷಈ࡞ΛΧελϚΠζ
All Rights Reserved. Copyright © CRESCO LTD. 23 Mapػೳͱ͔·ͩ·ͩ͋Γ·͕͢ɺɺɺ ͦΖͦΖ·ͱΊ·͢
All Rights Reserved. Copyright © CRESCO LTD. 24 ࠓͷຊ ͢Ͱʹ͋ΔiOSɺAndroidωΟςΟϒͰ
࡞ΒΕͨΞϓϦΛXamarin.FormsʹҠ২ ͢Δ࣮ͬͯࡍͷͱ͜ΖɺͲ͏ͳͷʁ
All Rights Reserved. Copyright © CRESCO LTD. 25 UIɾɾɾʁ Native
iOS Xamarin.Forms iOS Native Android Xamarin.Forms Android Xamarin.Formsͷඪ४෦͚ͩͰ͋Δఔ࠶ݱՄೳɻ ϓϥοτϑΥʔϜ͝ͱʹಠࣗͷ༷͕͋Δ߹Custom RendererͰ࣮ɻ ಠ༷͕ࣗଟ͍߹ɺXamarin NativeͰ࣮͢Δํ͕ྑ͍߹ɻ
All Rights Reserved. Copyright © CRESCO, LTD. 26 ϩδοΫɺϦιʔεɾɾɾʁ #
ػೳ ڞ௨ ݸผ උߟ 1 ϝΠϯϝχϡʔ ʢάϩʔόϧϝχϡʔʣػೳ ݸผ ֤OSͷUXʹै͍ݸผ࣮ 2 ը૾ૉࡐ ڞ௨ େ͖ΊͷαΠζը૾Λ४උɺΞεϖΫτൺΛอͪͭͭॖখͯ͠දࣔ͢Δ͜ͱͰڞ௨ԽՄೳ 3 ը໘ϨΠΞτ ΄΅ڞ௨ άϩʔόϧϝχϡʔɾϋϯόʔΨʔϝχϡʔҎ֎ڞ௨Ͱ࣮ 4 Ϛοϓදࣔػೳʗ ϚοϓΞϓϦ࿈ܞ ʑ Xamarin.Forms.Mapʹͯ΄΅ڞ௨ԽͰ͖͍ͯΔɻ ϚοϓΞϓϦݺͼग़͠෦ͷΈݸผ࣮ 5 ిΞϓϦػೳ࿈ܞ ʑ ֤OSిΞϓϦݺͼग़͠෦ͷΈݸผ࣮ ̒ ϝʔϧΞϓϦػೳ࿈ܞ ʑ ֤OSϝʔϧΞϓϦݺͼग़͠෦ͷΈݸผ࣮ ɾը໘ભҠɺ௨৴ɺϏδωεϩδοΫͳͲجຊڞ௨ԽՄೳʂ ɾిɺϝʔϧͳͲσόΠεݻ༗ػೳDependency ServiceͰݸผ࣮ʂ ɾXamarin PluginͳͲ͕ॆ࣮ͯ͘͠Δͱݸผ࣮͕ෆཁʹͳΔέʔεɻ ɾEnbedded ResourceͰϦιʔεڞ௨Խ͕Մೳɻ UIʹͩ͜ΘΒͳ͍ͳΒXamarin.FormsͰ؆୯ʹ࡞Εͯ͠·͍·͢ʂ
All Rights Reserved. Copyright © CRESCO LTD. 27 ڞ௨Խׂ߹ɾɾɾʁ UIΛ΄΅ڞ௨Խ͠ɺϩδοΫσόΠεݻ༗ػೳҎ֎ڞ௨Խ
→7ׂ͘Β͍ڞ௨ԽͰ͖Δʂ
All Rights Reserved. Copyright © CRESCO, LTD. 28 ·ͱΊ <UI؍>
ɹɾXamarin.FormsͰඪ४తͳUIͳΒରԠՄೳɻ ɹɾXamarin.Forms PreviewerͰXAMLϓϨϏϡʔαϙʔτ^^ ɹɾUIಠ༷͕ࣗଟ͍߹Xamarin.NativeΛݕ౼͖͢ɻ <Ϧιʔε؍> ɹɾEnbedded ResourceͰڞ௨ԽՄೳɻ ɹɾ͢Ͱʹ֤ϓϥοτϑΥʔϜղ૾͝ͱͷϦιʔε͕͋ΔͳΒ ɹɹϓϥοτϑΥʔϜ͝ͱʹ༻ҙ͢Δํ͕͍͍ɻ ʻϩδοΫ؍ʼ ɹɾը૾ՃܥσόΠεݻ༗ػೳΛ͝Γ͝Γ͏ͷͰͳ͚Ε ɹɹXamarin.FormsͰ͋Δఔڞ௨ԽͰ͖Δɻ ʻ࠶ར༻ੑʼ ɹɾFormsͳΒUIεΫϥονͱಉ ɹɾΞϧΰϦζϜ͋Δఔ͍·ΘͤΔ͕ɺC#Ͱॻ͖͕͠ඞཁɻ ɹɾͦΕͳΓʹॳظίετ͔͔Δ͕ɺอकӡ༻අ༻Լ͕Δɻ
All Rights Reserved. Copyright © CRESCO, LTD. 29 Xamarin.Forms։ൃͷϓϩδΣΫτମ੍ Xamarin.FormsΛ༻͢Δ͜ͱͰɺඪ४తͳUIσόΠεʹґଘ͠ͳ͍ػೳεϚϗະܦݧͰ”։ൃ”
Մೳͱ͍͑·͢ɻ͔͠͠ɺڽͬͨUIσόΠεݻ༗ͷػೳɺͦͷଞϏϧυϦϦʔεʹؔͯ͠ɺͦ ΕͧΕͷOSͷಛੑΛཧղ͢Δඞཁ͕͋Γ·͢ɻϨϕϧͷΞϓϦΛ։ൃ͢Δʹɺ֤ϓϥοτ ϑΥʔϜͷ։ൃܦݧऀΛΞαΠϯͤ͞Δඞཁ͕͋Γ·͢ɻฐࣾͰɺ֤ϓϥοτϑΥʔϜ։ൃऀަ͑ ͯϓϩδΣΫτମ੍ΛΉ͜ͱ͕ՄೳͰ͢ɻ ϓϩδΣΫτ Ϛωʔδϟ ITΞʔΩςΫτ Android Developer .NET Developer iOS Developer ։ൃϦʔμʔ
All Rights Reserved. Copyright © CRESCO, LTD. 30 ৄ͘͠ฉ͖͍ͨํɺɺɺ 5/18(ਫ)ʹΤΫηϧιϑτ͞·ɺΫϨείͷ߹ಉओ࠵ͷXamarinϏδωεηϛφʔΛ࣮ࢪ͠·͢ɻ
http://service.cresco.co.jp/seminar_event.shtml PepperʹΑΔσϞ͋Γ·͢ɻ ͓༠͍߹Θͤͷ্͝ࢀՃ͍ͩ͘͞ɻ ͝ਗ਼ௌ͋Γ͕ͱ͏͍͟͝·ͨ͠ɻ