Нарисуйте фон пользовательского просмотра из .png файла на Android - PullRequest
5 голосов
/ 26 января 2012

Я создал собственный вид, расширяясь из вида.В 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 ]

9 голосов
/ 26 января 2012

Вы на самом деле не хотите рисовать на загружаемом растровом изображении, вы просто хотите нарисовать его на 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));
        }
    }
}
0 голосов
/ 26 января 2012

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

...