2010-03-11 15 views
16

है, मैं एक एनीमेशन खींचने की कोशिश कर रहा हूं। ऐसा करने के लिए मैंने ऑनडो() विधि को देखें और ओवरराइड किया है। मैं जो अपेक्षा करता हूं वह यह है कि प्रत्येक बार ड्रॉ() को कैनवास कहा जाता है, जिसे मैं इसे छोड़ देता हूं और मैं इसे साफ़ करना चुन सकता हूं या बस इसके कुछ हिस्सों को खींच सकता हूं (इस तरह यह मैंने सतह दृश्य का उपयोग करते समय काम किया) लेकिन हर बार कैनवास वापस आ गया है पहले ही मंजूरी दे दी है। क्या कोई तरीका है कि मैं इसे साफ़ नहीं कर सकता? या हो सकता है कि पिछले राज्य को बिटमैप में सेव करें ताकि मैं बस उस बिटमैप को खींच सकूं और उसके बाद इसे ऊपर खींच सकूं?एंड्रॉइड व्यू.ऑनड्रा() हमेशा एक साफ कैनवास

उत्तर

28

मुझे यकीन नहीं है कि कोई रास्ता है या नहीं। लेकिन मेरे कस्टम विचारों के लिए मैं या तो प्रत्येक बार ड्रॉ() कहलाता हूं, या बिटमैप पर खींचता हूं और फिर कैनवास में बिटमैप खींचता हूं (जैसा कि आपने अपने प्रश्न में सुझाव दिया था)।

यहाँ मैं कैसे कर यह

class A extends View { 

    private Canvas canvas; 
    private Bitmap bitmap; 

    protected void onSizeChanged(int w, int h, int oldw, int oldh) { 
     if (bitmap != null) { 
      bitmap .recycle(); 
     } 
     canvas= new Canvas(); 
     bitmap = Bitmap.createBitmap(w, h, Bitmap.Config.ARGB_8888); 
     canvas.setBitmap(bitmap); 
    } 
    public void destroy() { 
     if (bitmap != null) { 
      bitmap.recycle(); 
     } 
    } 
    public void onDraw(Canvas c) { 
     //draw onto the canvas if needed (maybe only the parts of animation that changed) 
     canvas.drawRect(0,0,10,10,paint); 

     //draw the bitmap to the real canvas c 
     c.drawBitmap(bitmap, 
      new Rect(0,0,bitmap.getWidth(),bitmap.getHeight()), 
      new Rect(0,0,bitmap.getWidth(),bitmap.getHeight()), null); 
    } 
} 
+0

मैंने इसे थोड़ा सा पहले समझ लिया! इनपुट के लिए धन्यवाद! – CaseyB

+0

बफर करने के लिए ड्राइंग ठीक काम करता है, लेकिन यह विशाल ड्रॉ बिटमैप() विधि बहुत सारे एफपीएस खाती है :( –

+0

यह अभी मेरे लिए एक बाधा है - पूर्णस्क्रीन बिटमैप को आकर्षित करने के लिए प्रत्येक बार पिछली स्थिति को पुनर्स्थापित करने के लिए हर बार उच्च रिज़ॉल्यूशन डिवाइसों के लिए एफपीएस को प्रभावित करता है (2560x1600 के साथ किंडल 8.9 3 जी जेन की तरह)। क्या कैनवास को मजबूर करने के लिए वास्तव में कोई रास्ता नहीं है, यह पिछले राज्य को जारी रखता है? ओपनजीएल में गहराई से प्रदर्शन समस्या हल हो सकती है, हालांकि यह उस समय तक नहीं है। –

1

आपको मूल दृश्य और सतह दृश्य के बीच अंतर देखने के लिए here पर एक नज़र रखना चाहिए। एक सतह दृश्य में ड्राइंग के लिए एक समर्पित परत है, जो मुझे लगता है कि आपने पहले जो आकर्षित किया था उसका ट्रैक रखता है। अब यदि आप वास्तव में इसे मूल दृश्य पर करना चाहते हैं, तो आप itemized overlay for the mapview के उदाहरण की तरह, प्रत्येक आइटम को सरणी में खींचने का प्रयास कर सकते हैं। यह बहुत ही काम करना चाहिए

+0

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

+0

फिर खींचने योग्य सरणी का प्रयास करें? – Sephy

+0

आधुनिक एंड्रॉइड में यदि आप ओपनजीएल रूट जाना चाहते हैं तो आप एक बनावट दृश्य का उपयोग कर सकते हैं। – Adam

0

आपका उम्मीदों जिब नहीं है w/वास्तविकता :) कैनवास नहीं होगा जिस तरह से आप यह छोड़ दिया है, लेकिन यह बजाय खाली। आप खींचे जाने के लिए ऑब्जेक्ट्स का एक ऐरेलिस्ट बना सकते हैं (canvas.drawCircle(), canvas.drawBitmap() आदि), फिर ऑनड्रा() में ArrayList हालांकि पुनरावृत्त करें। मैं ग्राफिक्स प्रोग्रामिंग के लिए नया हूं लेकिन मैंने इसे छोटे पैमाने पर इस्तेमाल किया है। शायद एक बेहतर तरीका है।

+0

यह है कि यदि आप कैनवास बनाते हैं। इस तरह आपके पास खींचा जाने पर कुल नियंत्रण है। – CaseyB

+0

एक ऐरेलिस्ट के बजाय: आप ड्राइंग कॉल रिकॉर्ड करने के लिए पिक्चर क्लास का उपयोग कर सकते हैं। –

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