使用Xamarin编程android,我有一些 32x32 像素尺寸的图像,我需要在canvas
上显示。我一直在使用带有xhdpi
屏幕的Android SDK模拟器测试代码,图像似乎会自动调整大小以使其尺寸加倍。即它们变为 64像素宽,64像素高。然后,我创建了另一个带有mdpi
屏幕的AVD,图像似乎是正确的大小。
我已经阅读了android documentation和其他网站上与密度无关的像素,但似乎无法理解为什么图像尺寸会自动调整大小。幕后是否有隐含的大小调整?如果是这样,为什么Android开发人员不会在他们的文档中提到它?还有什么我需要设置的吗?下面是代码的相关部分(我调整大小的图像是 jp1 , jp2 等):
Paint bkgBmpPaint = new Paint(); Color myColor = new Color();
Paint myTextPaint = new Paint();
private int a = 0, b = 0, bw = 0;
private Bitmap partialBitmap = null;
DisplayMetrics dm = new DisplayMetrics();
private Bitmap jp1,jp2,jp3,jp4;
public MyCanvasPath(Context context) : base(context) //constructor
{
partialBitmap = Bitmap.CreateBitmap(Resources.Configuration.ScreenWidthDp, Resources.Configuration.ScreenHeightDp,Bitmap.Config.Argb8888);
float scale = Resources.DisplayMetrics.Density;
jp1 = BitmapFactory.DecodeResource(Resources, Resource.Drawable.jp1);
jp2 = BitmapFactory.DecodeResource(Resources, Resource.Drawable.jp2);
jp3 = BitmapFactory.DecodeResource(Resources, Resource.Drawable.jp3);
jp4 = BitmapFactory.DecodeResource(Resources, Resource.Drawable.jp4);
Canvas myCanvas = new Canvas(partialBitmap); b = myCanvas.Height; a = myCanvas.Width; bw = jp1.Width;
IList<Bitmap> pImgList = new List<Bitmap> {
jp1, jp2, jp3, jp4 };
imgCount = pImgList.Count;
for (int x = 0; x < imgCount; x++)
{
myCanvas.DrawBitmap(pBmpList.ElementAt(x), bw * x, 0, null);
}}
protected override void OnDraw(Canvas screenCanvas)
{
screenCanvas.DrawBitmap(partialBitmap, 0, 0, null);
partialBitmap.Recycle();
}
答案 0 :(得分:1)
我已经在Android文档和其他网站上阅读了关于密度无关的像素,但似乎无法理解为什么图像尺寸会自动调整大小。
问题在于[BitmapFactory.DecodeResource(Resources res,int id)](https://developer.android.com/reference/android/graphics/BitmapFactory.html#decodeResource(android.content.res.Resources,int))。该方法取决于密度。默认情况下,它将使用您的设备/模拟器的密度。您正在使用两个具有不同密度的仿真器对其进行测试。因此,此方法创建具有不同维度的位图。
解决方案: 为了避免这个问题,你应该使用这个方法的其他版本:[decodeResource(Resources res,int id,BitmapFactory.Options opts)](https://developer.android.com/reference/android/graphics/BitmapFactory.html#decodeResource(android.content.res.Resources,int,android.graphics.BitmapFactory.Options))with {{ 1}}设置为固定值,例如:
opts.Indensity