From e404af4f9c3fac87026ea787f0b1387df1731f0a Mon Sep 17 00:00:00 2001 From: Chris Howarth Date: Thu, 25 Apr 2019 19:55:04 +0100 Subject: [PATCH] Implement ListView and CollectionView comparison --- .../CollectionViewChallenge.Android.csproj | 13 +- .../Helpers/ConversionHelpers.cs | 14 ++ .../MainActivity.cs | 13 +- .../Properties/AndroidManifest.xml | 8 +- .../Renderers/LabelControlRenderer.cs | 84 ++++++++++++ .../AppDelegate.cs | 8 +- .../CollectionViewChallenge.iOS.csproj | 8 ++ .../Controls/UILabelControl.cs | 38 ++++++ .../Renderers/LabelControlRenderer.cs | 94 +++++++++++++ .../CollectionViewChallenge/App.xaml | 47 ++++++- .../CollectionViewChallenge/AppShell.xaml | 11 +- .../CollectionViewChallenge.csproj | 22 ++- .../Controls/LabelControl.cs | 47 +++++++ .../Controls/TagControl.cs | 129 ++++++++++++++++++ .../Converters/StringDateConverter.cs | 32 +++++ .../Converters/TrophyCountConverter.cs | 28 ++++ .../Models/GameModel.cs | 83 +++++++++++ .../Models/GamePlatform.cs | 13 ++ .../Models/TrophyOverview.cs | 45 ++++++ .../Translations/AppResources.Designer.cs | 81 +++++++++++ .../Resources/Translations/AppResources.resx | 128 +++++++++++++++++ .../Utility/Constants/Colours.cs | 21 +++ .../Utility/Constants/Thicknesses.cs | 9 ++ .../ViewModels/PageViewModel.cs | 24 ++++ .../Views/Cells/GameViewCell.xaml | 63 +++++++++ .../Views/Cells/GameViewCell.xaml.cs | 14 ++ .../Views/CollectionViewChallengePage.xaml | 75 ++++++++-- .../Views/CollectionViewChallengePage.xaml.cs | 9 +- .../Views/ListViewPage.xaml | 29 ++++ .../Views/ListViewPage.xaml.cs | 17 +++ Screenshots/collection_view.jpg | Bin 0 -> 258017 bytes Screenshots/list_view.jpg | Bin 0 -> 255866 bytes 32 files changed, 1163 insertions(+), 44 deletions(-) create mode 100644 CollectionViewChallenge/CollectionViewChallenge.Android/Helpers/ConversionHelpers.cs create mode 100644 CollectionViewChallenge/CollectionViewChallenge.Android/Renderers/LabelControlRenderer.cs create mode 100644 CollectionViewChallenge/CollectionViewChallenge.iOS/Controls/UILabelControl.cs create mode 100644 CollectionViewChallenge/CollectionViewChallenge.iOS/Renderers/LabelControlRenderer.cs create mode 100644 CollectionViewChallenge/CollectionViewChallenge/Controls/LabelControl.cs create mode 100644 CollectionViewChallenge/CollectionViewChallenge/Controls/TagControl.cs create mode 100644 CollectionViewChallenge/CollectionViewChallenge/Converters/StringDateConverter.cs create mode 100644 CollectionViewChallenge/CollectionViewChallenge/Converters/TrophyCountConverter.cs create mode 100644 CollectionViewChallenge/CollectionViewChallenge/Models/GameModel.cs create mode 100644 CollectionViewChallenge/CollectionViewChallenge/Models/GamePlatform.cs create mode 100644 CollectionViewChallenge/CollectionViewChallenge/Models/TrophyOverview.cs create mode 100644 CollectionViewChallenge/CollectionViewChallenge/Resources/Translations/AppResources.Designer.cs create mode 100644 CollectionViewChallenge/CollectionViewChallenge/Resources/Translations/AppResources.resx create mode 100644 CollectionViewChallenge/CollectionViewChallenge/Utility/Constants/Colours.cs create mode 100644 CollectionViewChallenge/CollectionViewChallenge/Utility/Constants/Thicknesses.cs create mode 100644 CollectionViewChallenge/CollectionViewChallenge/ViewModels/PageViewModel.cs create mode 100644 CollectionViewChallenge/CollectionViewChallenge/Views/Cells/GameViewCell.xaml create mode 100644 CollectionViewChallenge/CollectionViewChallenge/Views/Cells/GameViewCell.xaml.cs create mode 100644 CollectionViewChallenge/CollectionViewChallenge/Views/ListViewPage.xaml create mode 100644 CollectionViewChallenge/CollectionViewChallenge/Views/ListViewPage.xaml.cs create mode 100644 Screenshots/collection_view.jpg create mode 100644 Screenshots/list_view.jpg diff --git a/CollectionViewChallenge/CollectionViewChallenge.Android/CollectionViewChallenge.Android.csproj b/CollectionViewChallenge/CollectionViewChallenge.Android/CollectionViewChallenge.Android.csproj index d2c42fc..3f6589d 100644 --- a/CollectionViewChallenge/CollectionViewChallenge.Android/CollectionViewChallenge.Android.csproj +++ b/CollectionViewChallenge/CollectionViewChallenge.Android/CollectionViewChallenge.Android.csproj @@ -16,7 +16,7 @@ Resources Assets false - v8.1 + v9.0 true Xamarin.Android.Net.AndroidClientHandler @@ -31,6 +31,9 @@ prompt 4 None + false + false + false true @@ -52,6 +55,12 @@ + + 2.4.5.909-pre + + + 2.4.5.909-pre + @@ -64,7 +73,9 @@ + + diff --git a/CollectionViewChallenge/CollectionViewChallenge.Android/Helpers/ConversionHelpers.cs b/CollectionViewChallenge/CollectionViewChallenge.Android/Helpers/ConversionHelpers.cs new file mode 100644 index 0000000..1e9248d --- /dev/null +++ b/CollectionViewChallenge/CollectionViewChallenge.Android/Helpers/ConversionHelpers.cs @@ -0,0 +1,14 @@ +using Android.App; + +namespace CollectionViewChallenge.Droid.Helpers +{ + public static class ConversionHelper + { + public static int ConvertDPToPixels(int dp) + { + float scale = Application.Context.Resources.DisplayMetrics.Density; + + return (int)(dp * scale + 0.5); + } + } +} \ No newline at end of file diff --git a/CollectionViewChallenge/CollectionViewChallenge.Android/MainActivity.cs b/CollectionViewChallenge/CollectionViewChallenge.Android/MainActivity.cs index 72e1935..6ec1f5e 100644 --- a/CollectionViewChallenge/CollectionViewChallenge.Android/MainActivity.cs +++ b/CollectionViewChallenge/CollectionViewChallenge.Android/MainActivity.cs @@ -1,11 +1,8 @@ -using System; - -using Android.App; +using Android.App; using Android.Content.PM; -using Android.Runtime; -using Android.Views; -using Android.Widget; using Android.OS; +using Android.Runtime; +using FFImageLoading.Forms.Platform; namespace CollectionViewChallenge.Droid { @@ -22,8 +19,12 @@ protected override void OnCreate(Bundle savedInstanceState) global::Xamarin.Forms.Forms.SetFlags("Shell_Experimental", "Visual_Experimental", "CollectionView_Experimental", "FastRenderers_Experimental"); Xamarin.Essentials.Platform.Init(this, savedInstanceState); global::Xamarin.Forms.Forms.Init(this, savedInstanceState); + LoadApplication(new App()); + + CachedImageRenderer.Init(false); } + public override void OnRequestPermissionsResult(int requestCode, string[] permissions, [GeneratedEnum] Android.Content.PM.Permission[] grantResults) { Xamarin.Essentials.Platform.OnRequestPermissionsResult(requestCode, permissions, grantResults); diff --git a/CollectionViewChallenge/CollectionViewChallenge.Android/Properties/AndroidManifest.xml b/CollectionViewChallenge/CollectionViewChallenge.Android/Properties/AndroidManifest.xml index 8a8223a..e2341b5 100644 --- a/CollectionViewChallenge/CollectionViewChallenge.Android/Properties/AndroidManifest.xml +++ b/CollectionViewChallenge/CollectionViewChallenge.Android/Properties/AndroidManifest.xml @@ -1,5 +1,5 @@ - + - - - + + + \ No newline at end of file diff --git a/CollectionViewChallenge/CollectionViewChallenge.Android/Renderers/LabelControlRenderer.cs b/CollectionViewChallenge/CollectionViewChallenge.Android/Renderers/LabelControlRenderer.cs new file mode 100644 index 0000000..3fe9821 --- /dev/null +++ b/CollectionViewChallenge/CollectionViewChallenge.Android/Renderers/LabelControlRenderer.cs @@ -0,0 +1,84 @@ +using Android.Content; +using Android.Graphics.Drawables; +using CollectionViewChallenge.Controls; +using CollectionViewChallenge.Droid.Helpers; +using CollectionViewChallenge.Droid.Renderers; +using System.ComponentModel; +using Xamarin.Forms; +using Xamarin.Forms.Platform.Android; + +[assembly: ExportRenderer(typeof(LabelControl), typeof(LabelControlRenderer))] + +namespace CollectionViewChallenge.Droid.Renderers +{ + public class LabelControlRenderer : LabelRenderer + { + private GradientDrawable m_background; + + public LabelControlRenderer(Context context) + : base(context) + { + m_background = new GradientDrawable(); + m_background.SetShape(ShapeType.Rectangle); + } + + protected override void OnElementChanged(ElementChangedEventArgs + + @@ -133,6 +135,12 @@ + + 2.4.5.909-pre + + + 2.4.5.909-pre + diff --git a/CollectionViewChallenge/CollectionViewChallenge.iOS/Controls/UILabelControl.cs b/CollectionViewChallenge/CollectionViewChallenge.iOS/Controls/UILabelControl.cs new file mode 100644 index 0000000..33645ee --- /dev/null +++ b/CollectionViewChallenge/CollectionViewChallenge.iOS/Controls/UILabelControl.cs @@ -0,0 +1,38 @@ +using CoreGraphics; +using System; +using UIKit; + +namespace CollectionViewChallenge.iOS.Controls +{ + /// + /// Custom iOS UILabel that allows padding of content + /// + internal class UILabelControl : UILabel + { + private UIEdgeInsets m_padding = UIEdgeInsets.Zero; + public UIEdgeInsets Padding + { + get { return m_padding; } + set + { + m_padding = value; + InvalidateIntrinsicContentSize(); + } + } + + public override CGRect TextRectForBounds(CGRect bounds, nint numberOfLines) + { + CGRect rect = base.TextRectForBounds(Padding.InsetRect(bounds), numberOfLines); + + return new CGRect(rect.X - Padding.Left, + rect.Y - Padding.Top, + rect.Width + Padding.Left + Padding.Right, + rect.Height + Padding.Top + Padding.Bottom); + } + + public override void DrawText(CGRect rect) + { + base.DrawText(Padding.InsetRect(rect)); + } + } +} \ No newline at end of file diff --git a/CollectionViewChallenge/CollectionViewChallenge.iOS/Renderers/LabelControlRenderer.cs b/CollectionViewChallenge/CollectionViewChallenge.iOS/Renderers/LabelControlRenderer.cs new file mode 100644 index 0000000..f654c77 --- /dev/null +++ b/CollectionViewChallenge/CollectionViewChallenge.iOS/Renderers/LabelControlRenderer.cs @@ -0,0 +1,94 @@ +using CollectionViewChallenge.Controls; +using CollectionViewChallenge.iOS.Controls; +using CollectionViewChallenge.iOS.Renderers; +using System; +using System.ComponentModel; +using UIKit; +using Xamarin.Forms; +using Xamarin.Forms.Platform.iOS; + +[assembly: ExportRenderer(typeof(LabelControl), typeof(LabelControlRenderer))] + +namespace CollectionViewChallenge.iOS.Renderers +{ + public class LabelControlRenderer : LabelRenderer + { + private UIEdgeInsets m_padding; + + public LabelControlRenderer() + { + m_padding = new UIEdgeInsets(); + } + + protected override void OnElementChanged(ElementChangedEventArgs