Я создаю карточную игру, для этого я создал собственный вид поверхности, в котором загружаются изображения.Поскольку изображения загружаются из Интернета, они имеют разные размеры и выглядят визуально плохо на экране.Здесь я хочу добиться двух вещей.
- Загрузка изображений фиксированного размера или динамическое изменение размеров изображений.
- Рисование изображений снизу экрана в направлении вверх.
Для 1-го пункта я использовал метод CreateBitmap, но получил исключение ниже.
java.lang.OutOfMemoryError: Failed to allocate a 1915060280 byte allocation with 4194304 free bytes and 123MB until OOM error
Чтобы исправить проблему, я думал об использовании Glide / Picasso, основываясь на этом вопросе и this , но я обнаружил, что Glide / Picasso загружают только изображенияна изображении, но у меня нет изображения, я получил только пользовательский вид поверхности внутри линейного разметки.
Для 2-й точки я использовал поворот изображения.Ниже приведен код этого кода.
public void Render(Canvas paramCanvas)
{
try
{
// paramCanvas.DrawColor(Android.Graphics.Color.Blue);
int i = 0;
Down_Card_Gap = 0;
foreach (Cards localcard in FaceDownDeck.ToList())
{
Bitmap localimage = BitmapFactory.DecodeResource(Resources, localcard.GetImageId(context));
Bitmap rotatedimage = RotateBitmap(localimage, 180);
paramCanvas.DrawBitmap(rotatedimage, (Screen_Center_X - Card_Width / 2)+Down_Card_Gap, (Screen_Height - Card_Height), null);
// paramCanvas.DrawBitmap(localimage, (Screen_Center_X - Card_Width / 2), (Screen_Center_Y - Card_Height), null);
if (i++ == 7)
{ break; }
if (Down_Card_Gap > 0)
{
Down_Card_Gap += Card_Width / 2;
}
else
{
Down_Card_Gap -= Card_Width / 2;
}
Down_Card_Gap *= -1;
}
}
catch (Exception ex)
{
System.Diagnostics.Debug.WriteLine(ex.ToString());
}
}
private Bitmap RotateBitmap(Bitmap localimage, float angle)
{
Matrix matrix = new Matrix();
matrix.PostRotate(angle);
matrix.PostScale(Card_Width, Card_Height);
Bitmap resized= Bitmap.CreateBitmap(localimage, 0, 0, localimage.Width, localimage.Height, matrix, true);
localimage.Recycle();
return resized;
}
Я хочу знать, является ли это правильным подходом или же существует какой-либо более эффективный способ достижения функциональности.