void OnStackSizeChanged(object sender, EventArgs args) { double width = stackLayout.Width; double height = stackLayout.Height; if (width <= 0 || height <= 0) { return; } // Orient StackLayout based on portrait/landscape mode. stackLayout.Orientation = (width < height) ? StackOrientation.Vertical : StackOrientation.Horizontal; // Calculate square size and position based on stack size. squareSize = Math.Min(width, height) / NUM; absoluteLayout.WidthRequest = NUM * squareSize; absoluteLayout.HeightRequest = NUM * squareSize; foreach (View view in absoluteLayout.Children) { XuzzleSquare square = (XuzzleSquare)view; square.SetLabelFont(0.4 * squareSize, FontAttributes.Bold); AbsoluteLayout.SetLayoutBounds(square, new Rectangle(square.Col * squareSize, square.Row * squareSize, squareSize, squareSize)); } }
async Task AnimateSquare(int row, int col, int newRow, int newCol, uint length) { // The Square to be animated. XuzzleSquare animaSquare = squares [row, col]; // The destination rectangle. Rectangle rect = new Rectangle(squareSize * emptyCol, squareSize * emptyRow, squareSize, squareSize); // This is the actual animation call. await animaSquare.LayoutTo(rect, length); // Set several variables and properties for new layout. squares [newRow, newCol] = animaSquare; animaSquare.Row = newRow; animaSquare.Col = newCol; squares [row, col] = null; emptyRow = row; emptyCol = col; }
async void OnSquareTapped(object parameter) { if (isBusy) { return; } isBusy = true; XuzzleSquare tappedSquare = (XuzzleSquare)parameter; await ShiftIntoEmpty(tappedSquare.Row, tappedSquare.Col); isBusy = false; // Check for a "win". if (isPlaying) { int index; for (index = 0; index < NUM * NUM - 1; index++) { int row = index / NUM; int col = index % NUM; XuzzleSquare square = squares [row, col]; if (square == null || square.Index != index) { break; } } // We have a winner! if (index == NUM * NUM - 1) { isPlaying = false; await DoWinAnimation(); } } }
public XuzzlePage() { // AbsoluteLayout to host the squares. absoluteLayout = new AbsoluteLayout() { HorizontalOptions = LayoutOptions.Center, VerticalOptions = LayoutOptions.Center }; // Create XuzzleSquare's for all the rows and columns. string text = "{XAMARIN.FORMS}"; string winText = "CONGRATULATIONS"; int index = 0; for (int row = 0; row < NUM; row++) { for (int col = 0; col < NUM; col++) { // But skip the last one! if (row == NUM - 1 && col == NUM - 1) { break; } // Instantiate XuzzleSquare. XuzzleSquare square = new XuzzleSquare(text [index], winText [index], index) { Row = row, Col = col }; // Add tap recognition TapGestureRecognizer tapGestureRecognizer = new TapGestureRecognizer { Command = new Command(OnSquareTapped), CommandParameter = square }; square.GestureRecognizers.Add(tapGestureRecognizer); // Add it to the array and the AbsoluteLayout. squares [row, col] = square; absoluteLayout.Children.Add(square); index++; } } // This is the "Randomize" button. randomizeButton = new Button { Text = "Randomize", HorizontalOptions = LayoutOptions.Center, VerticalOptions = LayoutOptions.CenterAndExpand }; randomizeButton.Clicked += OnRandomizeButtonClicked; // Label to display elapsed time. timeLabel = new Label { FontSize = Device.GetNamedSize(NamedSize.Large, typeof(Label)), FontAttributes = FontAttributes.Bold, HorizontalOptions = LayoutOptions.Center, VerticalOptions = LayoutOptions.CenterAndExpand }; // Put everything in a StackLayout. stackLayout = new StackLayout { Children = { new StackLayout { VerticalOptions = LayoutOptions.FillAndExpand, HorizontalOptions = LayoutOptions.FillAndExpand, Children = { randomizeButton, timeLabel } }, absoluteLayout } }; stackLayout.SizeChanged += OnStackSizeChanged; // And set that to the content of the page. this.Padding = new Thickness(0, Device.RuntimePlatform == Device.iOS ? 20 : 0, 0, 0); this.Content = stackLayout; }
public XuzzlePage () { // AbsoluteLayout to host the squares. absoluteLayout = new AbsoluteLayout () { HorizontalOptions = LayoutOptions.Center, VerticalOptions = LayoutOptions.Center }; // Create XuzzleSquare's for all the rows and columns. string text = "{XAMARIN.FORMS}"; string winText = "CONGRATULATIONS"; int index = 0; for (int row = 0; row < NUM; row++) { for (int col = 0; col < NUM; col++) { // But skip the last one! if (row == NUM - 1 && col == NUM - 1) break; // Instantiate XuzzleSquare. XuzzleSquare square = new XuzzleSquare (text [index], winText [index], index) { Row = row, Col = col }; // Add tap recognition TapGestureRecognizer tapGestureRecognizer = new TapGestureRecognizer { Command = new Command (OnSquareTapped), CommandParameter = square }; square.GestureRecognizers.Add (tapGestureRecognizer); // Add it to the array and the AbsoluteLayout. squares [row, col] = square; absoluteLayout.Children.Add (square); index++; } } // This is the "Randomize" button. randomizeButton = new Button { Text = "Randomize", HorizontalOptions = LayoutOptions.Center, VerticalOptions = LayoutOptions.CenterAndExpand }; randomizeButton.Clicked += OnRandomizeButtonClicked; // Label to display elapsed time. timeLabel = new Label { FontSize = Device.GetNamedSize (NamedSize.Large, typeof(Label)), FontAttributes = FontAttributes.Bold, HorizontalOptions = LayoutOptions.Center, VerticalOptions = LayoutOptions.CenterAndExpand }; // Put everything in a StackLayout. stackLayout = new StackLayout { Children = { new StackLayout { VerticalOptions = LayoutOptions.FillAndExpand, HorizontalOptions = LayoutOptions.FillAndExpand, Children = { randomizeButton, timeLabel } }, absoluteLayout } }; stackLayout.SizeChanged += OnStackSizeChanged; // And set that to the content of the page. this.Padding = new Thickness (0, Device.OnPlatform (20, 0, 0), 0, 0); this.Content = stackLayout; }