diff --git a/CarouselViewChallenge/CarouselViewChallenge.Android/Assets/Montserrat-Bold.ttf b/CarouselViewChallenge/CarouselViewChallenge.Android/Assets/Montserrat-Bold.ttf new file mode 100644 index 0000000..ae33a45 Binary files /dev/null and b/CarouselViewChallenge/CarouselViewChallenge.Android/Assets/Montserrat-Bold.ttf differ diff --git a/CarouselViewChallenge/CarouselViewChallenge.Android/Assets/Montserrat-Regular.ttf b/CarouselViewChallenge/CarouselViewChallenge.Android/Assets/Montserrat-Regular.ttf new file mode 100644 index 0000000..5b4b5af Binary files /dev/null and b/CarouselViewChallenge/CarouselViewChallenge.Android/Assets/Montserrat-Regular.ttf differ diff --git a/CarouselViewChallenge/CarouselViewChallenge.Android/CarouselViewChallenge.Android.csproj b/CarouselViewChallenge/CarouselViewChallenge.Android/CarouselViewChallenge.Android.csproj index 88bda65..7c799a6 100644 --- a/CarouselViewChallenge/CarouselViewChallenge.Android/CarouselViewChallenge.Android.csproj +++ b/CarouselViewChallenge/CarouselViewChallenge.Android/CarouselViewChallenge.Android.csproj @@ -63,6 +63,8 @@ + + @@ -100,5 +102,17 @@ CarouselViewChallenge + + + + + + + + + + + + \ No newline at end of file diff --git a/CarouselViewChallenge/CarouselViewChallenge.Android/MainActivity.cs b/CarouselViewChallenge/CarouselViewChallenge.Android/MainActivity.cs index fd4e22a..e73fb4d 100644 --- a/CarouselViewChallenge/CarouselViewChallenge.Android/MainActivity.cs +++ b/CarouselViewChallenge/CarouselViewChallenge.Android/MainActivity.cs @@ -1,10 +1,6 @@ -using System; - -using Android.App; +using Android.App; using Android.Content.PM; using Android.Runtime; -using Android.Views; -using Android.Widget; using Android.OS; namespace CarouselViewChallenge.Droid diff --git a/CarouselViewChallenge/CarouselViewChallenge.Android/Resources/drawable/coffee.png b/CarouselViewChallenge/CarouselViewChallenge.Android/Resources/drawable/coffee.png new file mode 100644 index 0000000..990fd1b Binary files /dev/null and b/CarouselViewChallenge/CarouselViewChallenge.Android/Resources/drawable/coffee.png differ diff --git a/CarouselViewChallenge/CarouselViewChallenge.Android/Resources/drawable/marshmallows.png b/CarouselViewChallenge/CarouselViewChallenge.Android/Resources/drawable/marshmallows.png new file mode 100644 index 0000000..7e14621 Binary files /dev/null and b/CarouselViewChallenge/CarouselViewChallenge.Android/Resources/drawable/marshmallows.png differ diff --git a/CarouselViewChallenge/CarouselViewChallenge.Android/Resources/drawable/plant.png b/CarouselViewChallenge/CarouselViewChallenge.Android/Resources/drawable/plant.png new file mode 100644 index 0000000..32fe73a Binary files /dev/null and b/CarouselViewChallenge/CarouselViewChallenge.Android/Resources/drawable/plant.png differ diff --git a/CarouselViewChallenge/CarouselViewChallenge.Android/Resources/drawable/strawberry.png b/CarouselViewChallenge/CarouselViewChallenge.Android/Resources/drawable/strawberry.png new file mode 100644 index 0000000..af34435 Binary files /dev/null and b/CarouselViewChallenge/CarouselViewChallenge.Android/Resources/drawable/strawberry.png differ diff --git a/CarouselViewChallenge/CarouselViewChallenge.iOS/AppDelegate.cs b/CarouselViewChallenge/CarouselViewChallenge.iOS/AppDelegate.cs index 949500f..94f143f 100644 --- a/CarouselViewChallenge/CarouselViewChallenge.iOS/AppDelegate.cs +++ b/CarouselViewChallenge/CarouselViewChallenge.iOS/AppDelegate.cs @@ -1,8 +1,4 @@ -using System; -using System.Collections.Generic; -using System.Linq; - -using Foundation; +using Foundation; using UIKit; namespace CarouselViewChallenge.iOS diff --git a/CarouselViewChallenge/CarouselViewChallenge.iOS/CarouselViewChallenge.iOS.csproj b/CarouselViewChallenge/CarouselViewChallenge.iOS/CarouselViewChallenge.iOS.csproj index 66fa550..7931a6c 100644 --- a/CarouselViewChallenge/CarouselViewChallenge.iOS/CarouselViewChallenge.iOS.csproj +++ b/CarouselViewChallenge/CarouselViewChallenge.iOS/CarouselViewChallenge.iOS.csproj @@ -65,6 +65,8 @@ + + @@ -131,6 +133,9 @@ + + 1.3.2-beta + @@ -139,4 +144,16 @@ CarouselViewChallenge + + + + + + + + + + + + \ No newline at end of file diff --git a/CarouselViewChallenge/CarouselViewChallenge.iOS/Info.plist b/CarouselViewChallenge/CarouselViewChallenge.iOS/Info.plist index 9354ef2..3f1ea01 100644 --- a/CarouselViewChallenge/CarouselViewChallenge.iOS/Info.plist +++ b/CarouselViewChallenge/CarouselViewChallenge.iOS/Info.plist @@ -34,5 +34,10 @@ CarouselViewChallenge XSAppIconAssets Assets.xcassets/AppIcon.appiconset + UIAppFonts + + Montserrat-Bold.ttf + Montserrat-Regular.ttf + diff --git a/CarouselViewChallenge/CarouselViewChallenge.iOS/Resources/Montserrat-Bold.ttf b/CarouselViewChallenge/CarouselViewChallenge.iOS/Resources/Montserrat-Bold.ttf new file mode 100644 index 0000000..ae33a45 Binary files /dev/null and b/CarouselViewChallenge/CarouselViewChallenge.iOS/Resources/Montserrat-Bold.ttf differ diff --git a/CarouselViewChallenge/CarouselViewChallenge.iOS/Resources/Montserrat-Regular.ttf b/CarouselViewChallenge/CarouselViewChallenge.iOS/Resources/Montserrat-Regular.ttf new file mode 100644 index 0000000..5b4b5af Binary files /dev/null and b/CarouselViewChallenge/CarouselViewChallenge.iOS/Resources/Montserrat-Regular.ttf differ diff --git a/CarouselViewChallenge/CarouselViewChallenge.iOS/Resources/coffee.png b/CarouselViewChallenge/CarouselViewChallenge.iOS/Resources/coffee.png new file mode 100644 index 0000000..990fd1b Binary files /dev/null and b/CarouselViewChallenge/CarouselViewChallenge.iOS/Resources/coffee.png differ diff --git a/CarouselViewChallenge/CarouselViewChallenge.iOS/Resources/marshmallows.png b/CarouselViewChallenge/CarouselViewChallenge.iOS/Resources/marshmallows.png new file mode 100644 index 0000000..7e14621 Binary files /dev/null and b/CarouselViewChallenge/CarouselViewChallenge.iOS/Resources/marshmallows.png differ diff --git a/CarouselViewChallenge/CarouselViewChallenge.iOS/Resources/plant.png b/CarouselViewChallenge/CarouselViewChallenge.iOS/Resources/plant.png new file mode 100644 index 0000000..32fe73a Binary files /dev/null and b/CarouselViewChallenge/CarouselViewChallenge.iOS/Resources/plant.png differ diff --git a/CarouselViewChallenge/CarouselViewChallenge.iOS/Resources/strawberry.png b/CarouselViewChallenge/CarouselViewChallenge.iOS/Resources/strawberry.png new file mode 100644 index 0000000..af34435 Binary files /dev/null and b/CarouselViewChallenge/CarouselViewChallenge.iOS/Resources/strawberry.png differ diff --git a/CarouselViewChallenge/CarouselViewChallenge/App.xaml b/CarouselViewChallenge/CarouselViewChallenge/App.xaml index f3469f1..0b21777 100644 --- a/CarouselViewChallenge/CarouselViewChallenge/App.xaml +++ b/CarouselViewChallenge/CarouselViewChallenge/App.xaml @@ -6,5 +6,24 @@ mc:Ignorable="d" x:Class="CarouselViewChallenge.App"> + + + + #FFFFFF + #000000 + + + + + + + + \ No newline at end of file diff --git a/CarouselViewChallenge/CarouselViewChallenge/Behaviors/CarouselViewParallaxBehavior.cs b/CarouselViewChallenge/CarouselViewChallenge/Behaviors/CarouselViewParallaxBehavior.cs new file mode 100644 index 0000000..c571603 --- /dev/null +++ b/CarouselViewChallenge/CarouselViewChallenge/Behaviors/CarouselViewParallaxBehavior.cs @@ -0,0 +1,81 @@ +using CarouselViewChallenge.Models; +using System; +using System.Linq; +using Xamarin.Forms; + +namespace CarouselViewChallenge.Behaviors +{ + public class CarouselViewParallaxBehavior : Behavior + { + public static readonly BindableProperty ParallaxOffsetProperty = + BindableProperty.Create(nameof(ParallaxOffset), typeof(double), typeof(CarouselViewParallaxBehavior), 200.0d, + BindingMode.TwoWay, null); + + public double ParallaxOffset + { + get { return (double)GetValue(ParallaxOffsetProperty); } + set { SetValue(ParallaxOffsetProperty, value); } + } + + protected override void OnAttachedTo(CarouselView bindable) + { + base.OnAttachedTo(bindable); + bindable.Scrolled += new EventHandler(OnScrolled); + } + + protected override void OnDetachingFrom(CarouselView bindable) + { + base.OnDetachingFrom(bindable); + bindable.Scrolled -= new EventHandler(OnScrolled); + } + + private void OnScrolled(object sender, ItemsViewScrolledEventArgs e) + { + var carousel = (CarouselView)sender; + var carouselItems = carousel.ItemsSource.Cast().ToList(); + var currentIndex = e.CenterItemIndex; + var lastIndex = e.LastVisibleItemIndex; + var layout = carousel.ItemsLayout; + var adjust = Device.RuntimePlatform == Device.Android ? 3 : 1; + + if (layout is LinearItemsLayout listItemsLayout) + { + if (listItemsLayout.Orientation == ItemsLayoutOrientation.Horizontal) + { + var carouselWidth = carousel.Width; + var offset = (carouselWidth * (currentIndex + 1)) - (e.HorizontalOffset / adjust); + var position = (offset * ParallaxOffset / carouselWidth) - ParallaxOffset; + var scale = (offset * 100 / carouselWidth) / 100; + + var lastItem = carouselItems[lastIndex] as Carouselitem; + lastItem.Position = position + ParallaxOffset; + lastItem.Rotation = position / 2; + lastItem.Scale = 1 - scale; + + var currentItem = carouselItems[currentIndex] as Carouselitem; + currentItem.Position = position; + currentItem.Rotation = position; + currentItem.Scale = scale; + } + + if (listItemsLayout.Orientation == ItemsLayoutOrientation.Vertical) + { + var carouselHeight = carousel.Height; + var offset = (carouselHeight * (currentIndex + 1)) - (e.VerticalOffset / adjust); + var position = (offset * ParallaxOffset / carouselHeight) - ParallaxOffset; + var scale = offset * 100 / carouselHeight / 100; + + var lastItem = carouselItems[lastIndex] as Carouselitem; + lastItem.Position = position + ParallaxOffset; + lastItem.Rotation = position / 2; + lastItem.Scale = 1 - scale; + + var currentItem = carouselItems[currentIndex] as Carouselitem; + currentItem.Position = position; + currentItem.Rotation = position; + currentItem.Scale = scale; + } + } + } + } +} \ No newline at end of file diff --git a/CarouselViewChallenge/CarouselViewChallenge/CarouselViewChallenge.csproj b/CarouselViewChallenge/CarouselViewChallenge/CarouselViewChallenge.csproj index 297f2f1..1ed5f72 100644 --- a/CarouselViewChallenge/CarouselViewChallenge/CarouselViewChallenge.csproj +++ b/CarouselViewChallenge/CarouselViewChallenge/CarouselViewChallenge.csproj @@ -7,11 +7,8 @@ - - - - - + + diff --git a/CarouselViewChallenge/CarouselViewChallenge/Models/Carouselitem.cs b/CarouselViewChallenge/CarouselViewChallenge/Models/Carouselitem.cs new file mode 100644 index 0000000..dcd97c5 --- /dev/null +++ b/CarouselViewChallenge/CarouselViewChallenge/Models/Carouselitem.cs @@ -0,0 +1,54 @@ +using System.ComponentModel; +using System.Runtime.CompilerServices; + +namespace CarouselViewChallenge.Models +{ + public class Carouselitem : Drink, INotifyPropertyChanged + { + private double _position; + private double _rotation; + private double _scale; + + public Carouselitem() + { + Scale = 1; + } + + public double Position + { + get { return _position; } + set + { + _position = value; + OnPropertyChanged(); + } + } + + public double Rotation + { + get { return _rotation; } + set + { + _rotation = value; + OnPropertyChanged(); + } + } + + public double Scale + { + get { return _scale; } + set + { + _scale = value; + OnPropertyChanged(); + } + } + + public event PropertyChangedEventHandler PropertyChanged; + + protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = "") + { + PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName)); + } + } +} \ No newline at end of file diff --git a/CarouselViewChallenge/CarouselViewChallenge/Models/Drink.cs b/CarouselViewChallenge/CarouselViewChallenge/Models/Drink.cs new file mode 100644 index 0000000..a8cbf07 --- /dev/null +++ b/CarouselViewChallenge/CarouselViewChallenge/Models/Drink.cs @@ -0,0 +1,13 @@ +using System.Drawing; + +namespace CarouselViewChallenge.Models +{ + public class Drink + { + public string Title { get; set; } + public string Description { get; set; } + public string Image { get; set; } + public double Price { get; set; } + public Color Color { get; set; } + } +} \ No newline at end of file diff --git a/CarouselViewChallenge/CarouselViewChallenge/ViewModels/CarouselViewChallengePageViewModel.cs b/CarouselViewChallenge/CarouselViewChallenge/ViewModels/CarouselViewChallengePageViewModel.cs new file mode 100644 index 0000000..6568479 --- /dev/null +++ b/CarouselViewChallenge/CarouselViewChallenge/ViewModels/CarouselViewChallengePageViewModel.cs @@ -0,0 +1,36 @@ +using CarouselViewChallenge.Models; +using System.Collections.ObjectModel; +using Xamarin.Forms; + +namespace CarouselViewChallenge.ViewModels +{ + class CarouselViewChallengePageViewModel : BindableObject + { + private ObservableCollection _drinks; + + public CarouselViewChallengePageViewModel() + { + LoadDrinks(); + } + + public ObservableCollection Drinks + { + get { return _drinks; } + set + { + _drinks = value; + OnPropertyChanged(); + } + } + + void LoadDrinks() + { + Drinks = new ObservableCollection() { + new Carouselitem { Image="coffee.png", Title = "BRAZILIAN COFFEE", Color= Color.Maroon, Price =3.5, Description = "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua." }, + new Carouselitem { Image="marshmallows.png", Title = "HOT CHOCOLATE WITH MARSHMALLOWS", Color= Color.Wheat, Price = 8, Description = "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua." }, + new Carouselitem { Image="plant.png", Title = "MILK WITH MINT", Color= Color.Green, Price = 7.99, Description = "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua." }, + new Carouselitem { Image="strawberry.png", Title = "STRAWBERRY MILK", Color= Color.Red, Price = 6.5, Description = "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua." } + }; + } + } +} \ No newline at end of file diff --git a/CarouselViewChallenge/CarouselViewChallenge/Views/CarouselViewChallengePage.xaml b/CarouselViewChallenge/CarouselViewChallenge/Views/CarouselViewChallengePage.xaml index 1a7cc0d..4d35d5a 100644 --- a/CarouselViewChallenge/CarouselViewChallenge/Views/CarouselViewChallengePage.xaml +++ b/CarouselViewChallenge/CarouselViewChallenge/Views/CarouselViewChallengePage.xaml @@ -3,11 +3,128 @@ xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml" xmlns:d="http://xamarin.com/schemas/2014/forms/design" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" + xmlns:pancakeview="clr-namespace:Xamarin.Forms.PancakeView;assembly=Xamarin.Forms.PancakeView" + xmlns:behaviors="clr-namespace:CarouselViewChallenge.Behaviors" mc:Ignorable="d" x:Class="CarouselViewChallenge.Views.CarouselViewChallengePage"> + + + + + + + + + + + + + + + + + + + - - + + + + + + + + + + + + + + + + + + + + + + + + + + +