Tirage arrière-plan de la Vue personnalisée .png sur Android
J'ai créé une Vue personnalisée par l'extension de la Vue. Dans onDraw (), j'ai réussi à dessiner des cercles et d'autres choses. Mais maintenant, je veux ajouter un arrière-plan à partir d'une ressource (carte sd ou d'un cours d'eau) qui est en fait une carte, je la télécharger à partir de notre serveur et de tirer sur elle. C'est pour 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 en quelque sorte.setBitmap(bg) met en situation d'échec, je n'ai pas regardé les caractéristiques des images, mais en fait c'est juste un tux image (pas de 24 bits de couleurs) format PNG.
Quelqu'un peut-il me donner quelques conseils sur la manière d'ajouter une image d'arrière-plan de sorte que je peux en tirer?
Merci.
OriginalL'auteur AndaluZ | 2012-01-26
Vous devez vous connecter pour publier un commentaire.
Vous avez réellement ne voulez pas attirer l' sur l'image bitmap que vous chargez, vous voulez juste de dessiner sur le Canevas, de sorte que vous devriez utiliser de la Toile.drawBitmap(). Vous aussi devriez vraiment pas charger un Bitmap dans chaque onDraw(), de le faire dans le constructeur de la place. Essayez cette classe:
Vous pouvez également laisser Android dessiner l'image en arrière-plan:
Lorsque vous essayez mon premier exemple, exactement ce qui ne fonctionne pas? Une exception (si oui, de quelle exception)? Rien n'est dessiné à l'écran? Quelle version d'Android êtes-vous sur? Pouvez-vous fournir le code exact que vous utilisez que vous pouvez vous attendre à travailler, mais qui ne l'est pas?
C'est le travail de mon ami, avec .png ainsi que .jpg. Après votre post, je jouais encore et d'essayer quelques photos et trouver que ce n'est pas tout .jpeg fichiers de travail. Lorsque j'utilise des petites images jpg, 50 KO, il fonctionne, mais lors de l'utilisation de plus grandes images jpg, comme 600 KO le fond devient complètement blanc. Je ne sais pas si cela a à voir avec la taille de l'image, à cause de ceux qui ne travaillent pas est beaucoup plus grande taille que mon point de vue immobilier. À l'aide de setBackgroundDrawable() fonctionne, mais il réduit également à l'Affichage de l'immobilier de la taille.
OriginalL'auteur Martin Nordholts
Je crains que vous obtenez OutOfMemoryError, cause onDraw est appelé plusieurs fois au cours de vue du cycle de vie, et à chaque fois que vous allouez de la mémoire pour la nouvelle image. Juste faire des bg membre (peut-être statique) de votre classe et de charger qu'une seule fois - dans votre point de vue du constructeur. Et n'oubliez pas de recycler de bitmap sur la vue de détacher.
Ok, j'ai trouvé que bg = BitmapFactory.decodeFile(fichier); retourne un immuable bitmap, ce qui signifie que je ne peux pas tirer sur elle. Quelqu'un peut-il svp me donner juste un exemple simple comment charger une image à partir d'un fichier (ou un objet bytearray) et le mettre comme image d'arrière-plan d'une Vue personnalisée, afin que je puisse puiser dans onDraw() gestionnaire de la vue? Juste un exemple simple, je vous remercie.
Je peux proposer deux façons de faire une telle chose: 1) appel interne de la Vue.setBackgroundDrawable() (auparavant vous devez créer BitmapDrawable de bitmap); 2) l'appel de g.drawBitmap() au lieu de g.setBitmap(). Dans ce cas, vous n'êtes pas remplacer la toile de la source, mais dessiner.
Oui, thnx, BitmapDrawable a fait le tour pour moi. J'ai maintenant à savoir comment l'afficher sans mise à l'échelle, etc.. mais c'est une autre histoire, je vous remercie.
OriginalL'auteur OleGG