private void TilesMethod()
        {
            tileWidth = viewGameWidth / 4;

            tileArr    = new ArrayList();
            coordsTile = new ArrayList();

            int counter = 1;

            for (int rows = 0; rows < 4; rows++)
            {
                for (int colls = 0; colls < 4; colls++)
                {
                    MyTextView txtTile = new MyTextView(this);
                    txtTile.Text = counter.ToString();
                    txtTile.SetTextColor(Color.White);
                    txtTile.Gravity  = GravityFlags.Center;
                    txtTile.TextSize = 30;

                    GridLayout.Spec rowSpec  = GridLayout.InvokeSpec(txtTile.xPos);
                    GridLayout.Spec collSpec = GridLayout.InvokeSpec(txtTile.yPos);

                    GridLayout.LayoutParams tileLayoutParams = new GridLayout.LayoutParams(rowSpec, collSpec);

                    tileLayoutParams.Width  = tileWidth - 10;
                    tileLayoutParams.Height = tileWidth - 10;
                    tileLayoutParams.SetMargins(6, 6, 6, 6);

                    txtTile.LayoutParameters = tileLayoutParams;

                    txtTile.SetBackgroundColor(Color.Green);

                    Point point = new Point(colls, rows);
                    coordsTile.Add(point);

                    txtTile.xPos = point.X;
                    txtTile.yPos = point.Y;

                    txtTile.Touch += TxtTile_Touch;

                    tileArr.Add(txtTile);

                    gridLayout.AddView(txtTile);

                    counter++;
                }
            }

            gridLayout.RemoveView((MyTextView)tileArr[15]);
            tileArr.RemoveAt(15);
        }
        private void TxtTile_Touch(object sender, View.TouchEventArgs e)
        {
            if (e.Event.Action == MotionEventActions.Up)
            {
                if (tileArr.Contains(sender))
                {
                    MyTextView thisTile = (MyTextView)sender;

                    float xDifference = (float)Math.Pow(thisTile.xPos - emptyTile.X, 2);
                    float yDifference = (float)Math.Pow(thisTile.yPos - emptyTile.Y, 2);

                    float distanceXY = (float)Math.Sqrt(xDifference + yDifference);

                    //Tile can move
                    if (distanceXY == 1)
                    {
                        //Memorize where the tile use to be
                        Point currentPoint = new Point(thisTile.xPos, thisTile.yPos);

                        //take the empty tile
                        GridLayout.Spec rowSpec  = GridLayout.InvokeSpec(emptyTile.Y);
                        GridLayout.Spec collSpec = GridLayout.InvokeSpec(emptyTile.X);

                        GridLayout.LayoutParams newLayoutParams = new GridLayout.LayoutParams(rowSpec, collSpec);

                        thisTile.xPos = emptyTile.X;
                        thisTile.yPos = emptyTile.Y;

                        newLayoutParams.Width  = tileWidth - 10;
                        newLayoutParams.Height = tileWidth - 10;
                        newLayoutParams.SetMargins(6, 6, 6, 6);

                        thisTile.LayoutParameters = newLayoutParams;

                        emptyTile = currentPoint;
                    }

                    //#region Test positions touch tile and empty tile
                    //Console.WriteLine($"tile position\nx: {thisTile.xPos}\ny: {thisTile.yPos} ");
                    //Console.WriteLine($"empty tile position\nx: {emptyTile.X}\ny: {emptyTile.Y} ");
                    //#endregion
                }
            }
        }