将图像限制为包含视图的大小 (xamarin.android)

Limit Image to size of containing view (xamarin.android)

我正在尝试使用 Xamarin.Android 中的 GridLayout 创建棋盘。 GridLayout 中的每个 View 都是一个图像视图,描绘了一个片段(如果正方形包含一个片段)。添加图片资源前,看板显示正常。但是一旦添加图像,它就会将 ImageView 的大小推得比预期的大得多。

这是我正在使用的代码。以下方法是 运行 为板上的每个方块创建 ImageView 和 returns 将其添加到 GridLayout:

public View BuildSquare(Square squareModel)
    {
        SquareView rtn = new SquareView(this.Activity, squareModel); //SquareView extends ImageView
        rtn.UpdateBackgroundColor(); //set square color
        if (squareModel.Piece != null)
        {
            rtn.DrawPiece();
        }

        GridLayout.LayoutParams param = new GridLayout.LayoutParams();

        //set weight of each row and column to ensure equal size
        param.RowSpec = GridLayout.InvokeSpec(GridLayout.Undefined, 1f);
        param.ColumnSpec = GridLayout.InvokeSpec(GridLayout.Undefined, 1f);
        rtn.LayoutParameters = param;
        return rtn;
    }

DrawPiece()方法如下,设置图片资源:

 public void DrawPiece()
    {
        if (squareModel.Piece == null) return;

        string key = squareModel.Piece.GetPieceNotation();
        int resource = -1;

        //get the image resource corresponding to the piece on the ssquare
        if (AndroidConstants.PieceResources.TryGetValue(key, out resource))
        {
            this.SetImageResource(resource);
        }
        this.SetScaleType(ScaleType.FitXy);    

    }

当我注释掉 rtn.DrawPiece() 行时,面板正确显示如下所示:

但是当包含该行并设置图片资源时,显示如下:

您在这里看到的是图板上左上角的方块,为了容纳图像而膨胀得很大。我希望缩放图像以适合上面第一张图像中的正方形。我尝试过使用不同的 ScaleTypes,但似乎没有什么区别。这与使用 GridLayout 有关吗?还是这里发生了其他我想念的事情?

我认为您需要将高度和宽度设置为您的 SquareView

例如:

        public View BuildSquare(Square squareModel)
        {
            SquareView rtn = new SquareView(this, squareModel); //SquareView extends ImageView
            rtn.UpdateBackgroundColor(); //set square color
            if (squareModel.Piece ==0)
            {
               rtn.DrawPiece();
            }

            //Set the height and width
            GridLayout.LayoutParams param = new GridLayout.LayoutParams(new ViewGroup.LayoutParams(50, 50));

            //set weight of each row and column to ensure equal size
            param.RowSpec = GridLayout.InvokeSpec(GridLayout.Undefined, 1f);
            param.ColumnSpec = GridLayout.InvokeSpec(GridLayout.Undefined, 1f);
            rtn.LayoutParameters = param;
            return rtn;
        }

结果: