2011-02-07 17 views
5

मेरे पास एक ड्राइंग ऐप है जो उपयोगकर्ता को रिक्त कैनवास पर आकर्षित करने की अनुमति देता है। मैं वर्तमान बिटमैप के स्केल किए गए 'थंबनेल' को आकर्षित करने का प्रयास कर रहा हूं ताकि जब उपयोगकर्ता दृश्य में स्केल कर लेता है, तो वे थंबनेल को संदर्भित कर सकते हैं कि वे समग्र ड्रा कैनवास में कहां हैं। मेरे पास स्केलिंग काम कर रही है, और सही स्थान पर थंबनेल प्रदर्शित कर रहा हूं, लेकिन ऐसा प्रतीत होता है कि थंबनेल को बाद में ऑन ड्रॉज़ पर अपडेट नहीं किया जा रहा है जब नई लाइन/आकार जोड़े जाते हैं।एंड्रॉइड स्केलिंग कैनवास बिटमैप

तो यह है कि मैं इस दृश्य के लिए अंतर्निहित बिटमैप की पहुंच है मैं onSizeChanged में निम्नलिखित है() देखें के लिए (झलक दिखाने के लिए, आसानी से, आदि एक फाइल करने के लिए बिटमैप को बचाने के लिए सक्षम हो):

@Override 
protected void onSizeChanged(int w, int h, int oldw, int oldh) { 
    super.onSizeChanged(w, h, oldw, oldh); 

    // set the canvas height, panning, etc, based on the now inflated View 
    mWidth  = getWidth(); 
    mHeight  = getHeight(); 
    mAspectRatio = mWidth/mHeight; 
    mPanX  = 0; 
    mPanY  = 0; 

    // create the Bitmap, set it to the canvas 
mBitmap = Bitmap.createBitmap(mWidth, mHeight, Bitmap.Config.ARGB_8888); 
mCanvas.setBitmap(mBitmap); 
draw(mCanvas); 
} 

तब, जब उपयोगकर्ता ड्रॉ और अमान्य() कहा जाता है, मैं OnDraw() में निम्नलिखित थंबनेल उत्पन्न करने के लिए कार्य करें:

@Override 
protected void onDraw(Canvas canvas) { 
    <snipped code that draws paths, shapes to canvas> 

    if (mScaled) { 
     Bitmap out = Bitmap.createScaledBitmap(mBitmap, (int) thumbWidth, (int) thumbHeight, false); 
     canvas.drawBitmap(out, null, thumbnailRectF, thumbCanvasPaint); 
    } 
} 

थंबनेल अंतरिक्ष thumbCanvasPaint का उपयोग कर thumbnailRectF द्वारा परिभाषित में प्रदर्शित किया जाता , लेकिन बाद में ड्रॉ() कॉल पर, स्केल किए गए बिटमैप में है इसके मूल स्थिति से नहीं बदला गया है, भले ही पूर्ण आकार के सक्रिय कैनवास सभी चित्रों को दिखाते हैं, आदि। कुछ परीक्षणों के आधार पर, मुझे ऐसा लगता है कि जब मैं बिटमैप को प्रारंभिक कॉल (mCanvas) के साथ सेट कर रहा हूं, बाद में ऑनसाइट्स चेंज() में निर्दिष्ट एक के बजाय अंतर्निहित बिटमैप को लिख रहे हैं।

तो, मुझे लगता है मैं यह पता लगाने की कैसे मैं एक बिटमैप है कि मैं पहुँच readliy कर सकते हैं, फिर से आकार प्रदर्शन करने के लिए, को बचाने के लिए OnDraw कैनवास टाई कोशिश कर रहा हूँ आदि this question को देखते हुए, मैंने सोचा था कि ड्रॉ (mCanvas) ; कॉल mCanvas (मेरे मामले में, mBitmap) में निर्दिष्ट बिटमैप पर चला जाएगा, लेकिन व्यावहारिक रूप से, यह काम नहीं कर रहा है, जहां तक ​​कैनवास के लिए अद्यतन संबंधित हैं।

धन्यवाद,

पॉल

उत्तर

6
canvas.drawBitmap(out, null, thumbnailRectF, thumbCanvasPaint); 

canvas.drawBitmap(out, new Rect(0,0,mBitmap.getWidht, mBitmap.getheight), thumbnailRectF, thumbCanvasPaint); 

में बदल जानी चाहिए के लिए

Bitmap out = Bitmap.createScaledBitmap(mBitmap, (int) thumbWidth, (int).... 

कोई जरूरत भी जाँच लें कि mScaled हर समय जब सच है नहीं है ज़ूम ग्रेट है अटर से कम 1

+0

मैं इस उदाहरण whith अपने समाधान की समानता देख सकते हैं: http://www.barebonescoder.com/2010/06/android-development-simple-2d-graphics-part-1/ – Lumis

+0

हाँ, वाह, यह लिंक्ड प्रोग्राम का निर्माण लगभग 100% समान है, मेरे मुद्दे को छोड़कर कैनवास को बिटमैप टाइप करने के साथ, आदि। इस समाधान को आजमा रहे हैं। –

0

स्केल Bitmap.createScaledBitmap द्वारा बिटमैप तो आकर्षित काम नहीं करेगा

पैमाने के लिए समाधान कैनवास बिटमैप इस समारोह (से docs)

void drawBitmap (Bitmap bitmap, Rect src, Rect dst, Paint paint) 
// dst : Rect: The rectangle that the bitmap will be scaled/translated to fit into 

का उपयोग करें तो dst के आकार को बदल कर , आपका बिटमैप आकार

यहां उदाहरण दिया गया है यदि मैं ऊपर-बाईं ओर बिटमैप खींचना चाहता हूं और इसे 100px x 120px

पर स्केल करना चाहता हूं
Bitmap bitmap = BitmapFactory.decodeResource(...);//bitmap to be drawn 

float left = 0; 
float top = 0; 
RectF dst = new RectF(left, top, left + 100, top + 120); // width=100, height=120 

canvas.drawBitmap(bitmap, null, dst, null); 
संबंधित मुद्दे