2012-01-26 17 views
5

पर .png फ़ाइल से कस्टम व्यू की पृष्ठभूमि बनाएं I View से विस्तार करके एक कस्टम व्यू बनाया है। ऑन ड्रा() में मैंने कुछ मंडलियां और अन्य सामान खींचा। लेकिन अब मैं एक संसाधन (एसडी कार्ड या एक स्ट्रीम) से एक पृष्ठभूमि जोड़ना चाहता हूं जो वास्तव में एक मानचित्र है जिसे मैं अपने सर्वर से डाउनलोड करता हूं और उस पर आकर्षित करता हूं। यह Android 8+Android

@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) के लिए के बिगड़ते, मैं छवि चश्मा को देखा नहीं रखता है, लेकिन वास्तव में यह PNG प्रारूप का सिर्फ एक टक्स छवि (कोई 24 बिट रंग) है। क्या कोई मुझे कुछ सुझाव दे सकता है कि पृष्ठभूमि छवि कैसे जोड़ूं ताकि मैं इसे आकर्षित कर सकूं? धन्यवाद।

उत्तर

9

आप वास्तव में को पर लोड करने के लिए नहीं चाहते हैं, तो आप इसे कैनवास पर आकर्षित करना चाहते हैं, इसलिए आपको Canvas.drawBitmap() का उपयोग करना चाहिए। आपको वास्तव में प्रत्येक ऑन ड्रा() में बिटमैप लोड नहीं करना चाहिए, इसे इसके बजाय निर्माता में करें। इस वर्ग का प्रयास करें:

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 पृष्ठभूमि में बिटमैप आकर्षित करने दे सकते हैं: bg = BitmapFactory:

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

मार्टिन, इस स्पष्ट उदाहरण के लिए आपका बहुत बहुत धन्यवाद। काफी अजीब है कि मैंने पहले ही आपका पहला उदाहरण किया है और किसी भी तरह से यह काम नहीं करता है! यही वह जगह है जहां मैं खोना शुरू कर दिया। दूसरा एक दृश्य की अचल संपत्ति में फिट होने के लिए खींच रहा है, यह आखिर में क्या था। लेकिन आपका पहला मैं इसे बहुत बेहतर पसंद करता हूं, इस तरह मैं तस्वीर को अपने आकार को संशोधित किए बिना स्थिति में रख सकता हूं। – AndaluZ

+0

जब आप मेरा पहला उदाहरण आज़माते हैं, तो वास्तव में क्या काम नहीं करता है? एक अपवाद (यदि हां, तो क्या अपवाद)? स्क्रीन पर कुछ भी नहीं खींचा जाता है? आप किस एंड्रॉइड संस्करण पर चल रहे हैं? क्या आप उस सटीक कोड को प्रदान कर सकते हैं जिसका आप उपयोग करते हैं, लेकिन आप ऐसा नहीं करते हैं? –

+0

यह मेरे दोस्त, .png के साथ-साथ .jpg के साथ काम करता है। आपकी पोस्ट के बाद भी मैं खेल रहा था और कुछ चित्रों को आजमा रहा था और पाया कि सभी .jpeg फ़ाइलें काम नहीं करती हैं। जब मैं छोटे जेपीजी चित्रों का उपयोग करता हूं जैसे कि 50 केबी यह काम करता है, लेकिन जब 600 केबी की तरह बड़ी जेपीजी चित्रों का उपयोग करते हैं तो पृष्ठभूमि पूरी तरह से सफेद हो जाती है। मुझे नहीं पता कि इसे छवि आकार के साथ क्या करना है, क्योंकि जो लोग काम नहीं करते हैं, उनके दृश्य की अचल संपत्ति की तुलना में बहुत बड़ा आकार है। SetBackgroundDrawable() का उपयोग करना काम करता है, लेकिन यह दृश्य के रीयल एस्टेट आकार में भी कम हो जाता है। – AndaluZ

0

मुझे डर है कि आप OutOfMemoryError प्राप्त करते हैं, कारण पर जीवन को जीवन चक्र के दौरान कई बार बुलाया जाता है, और हर बार जब आप नए बिटमैप के लिए स्मृति आवंटित कर रहे होते हैं। बस अपने वर्ग के बीजी सदस्य (शायद - स्थैतिक) बनाएं और इसे केवल एक बार लोड करें - आपके दृश्य के निर्माता में। और दृश्य के अलग होने पर बिटमैप रीसायकल करना न भूलें।

+0

ठीक है, यह पहली बार में होता है, मैं पर एक ब्रेकपाइंट रख दिया है। डिकोड (फ़ाइल); डीबगिंग करते समय, g.setBitmap (बीजी) पर अपवाद होता है; मुझे एक IllegalStateException मिलता है, लेकिन इस अपवाद के बारे में अधिक जानकारी प्राप्त नहीं कर सका। मुझे डर है कि इसे बिटमैप के आकार या घनत्व के साथ करना है, लेकिन जब ग्राफिक्स की बात आती है तो मेरा ज्ञान सीमित होता है। – AndaluZ

+0

ठीक है, मुझे पता चला कि बीजी = बिटमैपफैक्टरी.decodeFile (फ़ाइल); एक अपरिवर्तनीय बिटमैप देता है, जिसका अर्थ है कि मैं इसे आकर्षित नहीं कर सकता। क्या कोई मुझे एक साधारण उदाहरण प्रदान कर सकता है कि फ़ाइल (या एक बाइटियर) से एक छवि को कैसे लोड किया जाए और इसे कस्टम व्यू की पृष्ठभूमि छवि के रूप में रखा जाए, तो मैं इसे देखने के ड्रॉ() हैंडलर पर खींच सकता हूं? बस एक साधारण उदाहरण, धन्यवाद। – AndaluZ

+0

मैं ऐसी चीज बनाने के दो तरीकों का प्रस्ताव दे सकता हूं: 1) आंतरिक रूप से कॉल करें .setBackgroundDrawable() (पहले आपको बिटमैप से बिटमैप ड्रायबल बनाने की आवश्यकता है); 2) g.setBitmap() के बजाय g.drawBitmap() को कॉल करें। इस मामले में आप कैनवास स्रोत को प्रतिस्थापित नहीं कर रहे हैं, लेकिन इसमें आकर्षित करें। – OleGG

 संबंधित मुद्दे

  • कोई संबंधित समस्या नहीं^_^