MonoDroid在GridView中缩放图像

时间:2013-01-23 14:33:23

标签: android android-layout mono xamarin.android

我有一个GridView,里面有一组ImageViews。我在GetView中创建图像如下:

public override View GetView(int position, View convertView, ViewGroup parent)
{
    ImageView imageView;

    if (convertView == null)
    {  // if it's not recycled, initialize some attributes  
        imageView = new ImageView(context);
        imageView.LayoutParameters = new GridView.LayoutParams(118, 132); // images are all the same dimension
        imageView.SetScaleType(ImageView.ScaleType.FitXy);
        imageView.SetPadding(5, 5, 5, 0);
    }
    else
    {
        imageView = (ImageView)convertView;
    }

    imageView.SetImageResource(thumbIds[position]);
    return imageView;
}

// references to our images  
int[] thumbIds =
{  
    Resource.Drawable.IconAdvocacy, Resource.Drawable.IconBusinessServices,  
    Resource.Drawable.IconContactUs, Resource.Drawable.IconDistrict,  
    Resource.Drawable.IconEvents, Resource.Drawable.IconFind,  
    Resource.Drawable.IconLawsRegs, Resource.Drawable.IconHealth,  
    Resource.Drawable.IconPracMgmt, Resource.Drawable.IconPublications,  
    Resource.Drawable.IconUpdates, Resource.Drawable.IconUploadPhoto
};

如您所见,我在LayoutParams函数中定义了固定大小。这会导致每个设备上的图像大小相同。

问题:缩放图像的最佳方法是什么?

我应该:   1)只需在每个drawable,-hdpi,-ldpi和-mdpi文件夹中创建不同大小的图像?如果是这样,我如何指定LayoutParams的大小?

2)获取DisplayMetrics?如果是这样,我该怎么做?我无法获得有关如何执行此操作的MonoDroid信息。文档中的示例似乎不起作用。

非常感谢任何帮助!!

谢谢

1 个答案:

答案 0 :(得分:0)

好吧,我认为既然你有一定数量的图像并且你没有动态加载它们,那么就可以提前创建你需要的资源,就像你在选项1中指定的一样。如果你我需要动态加载或动态加载图像,然后我可能会建议选择2路径。

选项1

要获取所有布局的图像,您可以为dpi扩展指定-land(landscape)和-port(portrait)扩展名。因此,例如,您可以使用drawable-mdpi-port和drawable-mdpi-land。有关选项的完整列表和一些更详细的信息,请参阅Supporting Multiple Screens文档。

选项2

此代码应该可以很好地通过代码获取当前显示密度。如果你从一个活动中调用它,这应该是完全正常的。如果您是从片段或诸如此类的东西进行调用,请确保首先引用该活动。

var metrics = new DisplayMetrics();
this.WindowManager.DefaultDisplay.GetMetrics(metrics);
switch (metrics.DensityDpi)
{
    case DisplayMetricsDensity.Default:
        break;
    case DisplayMetricsDensity.High:
        break;
    case DisplayMetricsDensity.Low:
        break;
    case DisplayMetricsDensity.Xhigh:
        break;
}