जब आप एंड्रॉइड 2.2 में लाइववैलपेपर बनाते हैं तो आपको ड्रॉ करने के लिए कैनवास (या जो भी 3 डी समतुल्य है) मिलता है। मैं कैनवास कमांड का उपयोग करके स्क्रैच से सब कुछ बनाने या प्री-रेंडर यूआई बिटमैप लोड करने के बजाय अंतर्निहित एंड्रॉइड यूआई टूल्स का उपयोग करके कुछ तत्वों को आकर्षित करना चाहता हूं।एंड्रॉइड पर लाइववैलपेपर में लेआउट संसाधनों का उपयोग
एक दृश्य को बिटमैप में कनवर्ट करना ठीक काम करता है। यानी यह बहुत अच्छा काम करता है:
// For example this works:
TextView view = new TextView(ctx);
view.layout(0, 0, 200, 100);
view.setText("test");
Bitmap b = Bitmap.createBitmap(200, 100, Bitmap.Config.ARGB_8888);
Canvas tempC = new Canvas(b);
view.draw(tempC);
c.drawBitmap(b, 200, 100, mPaint);
लेकिन, बच्चों के साथ लिनियरलाउट को परिवर्तित करने से समस्याएं आती हैं। आप केवल लाइनरलाइट स्वयं और उसके किसी भी बच्चे को प्राप्त नहीं करते हैं। उदाहरण के लिए, यदि मैंने लाइनरलाइट को एक सफेद पृष्ठभूमि रखने के लिए सेट किया है तो मुझे एक अच्छी तरह से प्रस्तुत सफेद बॉक्स मिलता है, लेकिन टेक्स्टव्यू बच्चों में से कोई भी बिटमैप में नहीं है। मैंने ड्रॉइंग कैश का उपयोग इसी तरह के परिणामों के साथ करने का भी प्रयास किया है।
मैं जिस कोड का उपयोग कर रहा हूं वह क्यूब उदाहरण है जिसमें केवल अतिरिक्त ड्रॉ कमांड होने के साथ ही परिवर्तन शामिल हैं। LinearLayout एक टोस्ट के रूप में ठीक काम करता है या नियमित दृश्य के रूप में (यानी सब कुछ अच्छी तरह से दिखाया जाता है), लाइववैलपेपर पर मुझे जो भी मिलता है वह रैखिकलायआउट की पृष्ठभूमि प्रदान करता है।
inflater = (LayoutInflater)getApplicationContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
layout = (LinearLayout) inflater.inflate(com.example.android.livecubes.R.layout.testLinearLayout, null);
layout.layout(0, 0, 400, 200);
Bitmap b = Bitmap.createBitmap(400, 200, Bitmap.Config.ARGB_8888);
Canvas tempC = new Canvas(b);
layout.draw(tempC);
c.drawBitmap(b, 10, 200, mPaint);
क्या किसी को पता है कि बच्चों को मेरे बिटमैप में उचित रूप से प्रस्तुत करने के लिए कुछ विशेष करने की आवश्यकता है या नहीं? यानी क्या मुझे लेआउट को बाकी बच्चों को प्रस्तुत करने के लिए कुछ खास करने की ज़रूरत है? क्या मुझे सभी बच्चों को कुछ करने के लिए एक समारोह लिखना चाहिए?
मैं अपने आप को सब कुछ जोड़ सकता हूं, क्योंकि प्रदर्शन काफी स्थिर है (यानी मैं इसे एक बार खींचता हूं और पृष्ठभूमि पर आकर्षित करने के लिए बिटमैप की एक प्रति रखता हूं) यह मेरे लिए आसान लगता है और अभी भी बहुत ही कुशल है।
संपादित करें: लेआउट यह लगता है जैसे कि लेआउट नीचे दृश्य पेड़ प्रगति नहीं कर रहा है की राज्य में थोड़ा अधिक खुदाई करते समय (यानी LinearLayout हो जाता है अपने लेआउट अभिकलन जब मैं लेआउट (कहते हैं), लेकिन बच्चों एक शून्य (0x0) आकार है)। 2008 android developer post में रोमैन गाय की पोस्ट के मुताबिक। आपको लेआउट पास के लिए इंतजार करना होगा या लेआउट को मजबूर करना होगा। समस्या यह है कि मैं एक लाइन पेपर इंजन से लेआउट व्यू समूह से जुड़ा हुआ एक लाइन पेपर इंजन से लेआउट पास की प्रतीक्षा कैसे कर सकता हूं? और यदि लेआउट को आपको बाएं, ऊपर, दाएं, नीचे सेट करने की आवश्यकता होती है तो मैं प्रत्येक बच्चे तत्व को मैन्युअल रूप से कैसे ले सकता हूं, जब मुझे नहीं पता कि ये क्या होना चाहिए।
मैंने बल देने की कोशिश की है बच्चों पर ध्यान दें लेकिन यह या तो मदद नहीं करता है। मुझे यकीन नहीं है कि लेआउट फ्रेमवर्क दृश्यों के पीछे कैसे काम करता है (इसके अलावा यह दो पास लेआउट करता है)। क्या लेआउट पास मैन्युअल रूप से करने का कोई तरीका है, यानी अभी? चूंकि यह एक गतिविधि नहीं है, इसलिए मुझे नहीं लगता कि सामान्य पृष्ठभूमि सामग्री बहुत सी तरह से हो रही है।
क्या आपने प्रस्तावित समाधान लागू किया है?मैं एक ही दृष्टिकोण का मूल्यांकन कर रहा हूं, लेकिन अपने अनुभवों से सीखना चाहूंगा – dparnas