Нарисуйте фон пользовательского просмотра из.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) продолжает работать, я не смотрел спецификации изображения, но на самом деле это просто смокинг (без 24-битных цветов) формата PNG. Может кто-нибудь дать мне несколько советов, как добавить фоновое изображение, чтобы я мог рисовать на нем? Спасибо.
2 ответа
На самом деле вы не хотите рисовать на загружаемом растровом изображении, вы просто хотите нарисовать его на Canvas, поэтому вы должны использовать 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 (возможно - static) вашего класса и загрузите его только один раз - в конструктор вашего представления. И не забывайте перерабатывать растровое изображение при отключении представления.