コード例 #1
0
        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));
            }
        }
コード例 #2
0
        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;
        }
コード例 #3
0
        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();
                }
            }
        }
コード例 #4
0
        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;
        }
コード例 #5
0
		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;
		}