Нарисовать фон пользовательского вида из .png-файла на Android

Я создал пользовательский вид, простираясь от представления. В onDraw () мне удалось нарисовать круги и другие вещи. Но теперь я хочу добавить фон из ресурса (SD-карты или потока), который на самом деле является картой, которую я загружаю с нашего сервера, и чем рисовать на ней. Это для Android 8+

@Override protected void onDraw(Canvas canvas) { Canvas g = canvas; String file = "/mnt/sdcard/download/tux.png"; Bitmap bg = null; try { bg = BitmapFactory.decodeFile(file); g.setBitmap(bg); } catch (Exception e) { Log.d("MyGraphics", "setBitmap() failed according to debug"); } } 

Как-то g.setBitmap (bg) продолжает терпеть неудачу, я не смотрел спецификации изображения, но на самом деле это всего лишь изображение в формате tux (без 24-битных цветов) формата PNG. Может кто-нибудь дать мне несколько советов, как добавить фоновое изображение, чтобы я мог рисовать на нем? Спасибо.

    На самом деле вы не хотите рисовать растровое изображение, которое вы загружаете, вы просто хотите нарисовать его на холсте, поэтому вы должны использовать Canvas.drawBitmap (). Вы также не должны загружать Bitmap в каждый onDraw (), вместо этого делать это в конструкторе. Попробуйте этот класс:

     package com.example.android; import android.content.Context; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.graphics.Canvas; import android.util.AttributeSet; import android.view.View; public class CustomView extends View { private final Bitmap mBitmapFromSdcard; public CustomView(Context context) { this(context, null); } public CustomView(Context context, AttributeSet attrs) { super(context, attrs); mBitmapFromSdcard = BitmapFactory.decodeFile("/mnt/sdcard/download/tux.png"); } @Override protected void onDraw(Canvas canvas) { Canvas g = canvas; if (mBitmapFromSdcard != null) { g.drawBitmap(mBitmapFromSdcard, 0, 0, null); } } } 

    Вы также можете позволить Android нарисовать растровое изображение в фоновом режиме:

     package com.example.android; import android.content.Context; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.graphics.drawable.BitmapDrawable; import android.util.AttributeSet; import android.view.View; public class CustomView extends View { public CustomView(Context context) { this(context, null); } public CustomView(Context context, AttributeSet attrs) { super(context, attrs); Bitmap bm = BitmapFactory.decodeFile("/mnt/sdcard/download/tux.png"); if (bm != null) { setBackgroundDrawable(new BitmapDrawable(bm)); } } } 

    Я боюсь, что вы получите OutOfMemoryError, потому что onDraw вызывается много раз в течение жизненного цикла представления и каждый раз, когда вы выделяете память для нового растрового изображения. Просто сделайте bg member (возможно – статический) вашего класса и загрузите его только один раз – в конструкторе вашего представления. И не забывайте перерабатывать растровое изображение при отсоединении вида.