2010-02-02 5 views
13

मेरी पहली और सबसे अजीब एंड्रॉइड प्रोजेक्ट के लिए, मैं एक होम स्क्रीन विजेट बनाना चाहता हूं जो उन Arc Clocks में से एक प्रदर्शित करता है जो सभी बच्चे इन दिनों के बारे में चिंतित हैं।डायनामिक रूप से तैयार सामग्री के साथ एंड्रॉइड विजेट को कार्यान्वित करने का सही तरीका क्या है?

RemoteViews की सीमाओं के आधार पर यह है कि यह वास्तव तैयार करने के लिए उचित तरीके से स्क्रीन पर वास्तविक लेआउट में एक ImageView उपयोग करने के लिए है मेरे लिए लग रहा है, तो जब यह अपडेट कर रहा है, एक या दो ShapeDrawable बना सकते हैं और आकर्षित उन्हें एक नव निर्मित पर बनाया गया। फिर, बिटमैप को ImageView के स्रोत के रूप में सेट करें।

उस प्रक्रिया के बारे में कुछ है जो मैं अभी भी grokking नहीं कर रहा हूँ। निम्नलिखित कोड है जिसे मैंने विजेट अपडेट करने के लिए उपयोग करने का प्रयास किया था। मुझे स्क्रीन पर कुछ भी नहीं मिला है। ImageView में प्लेसहोल्डर छवि है जो केवल src संपत्ति द्वारा निर्धारित की गई है। जब मैं इसे अपने ड्राइंग पर अपडेट करने के लिए कोड नहीं चलाता, तो प्लेसहोल्डर छवि जगह पर रहती है। तो, मुझे पता है कि यह कोड कुछ कर रहा है, बस स्पष्ट रूप से सही चीज़ नहीं है।

RemoteViews views = new RemoteViews(context.getPackageName(), R.layout.widget); 
Bitmap bitmap = Bitmap.createBitmap(100, 100, Config.ARGB_8888); 
Canvas canvas = new Canvas(bitmap); 

ShapeDrawable drawable = new ShapeDrawable(new ArcShape(0, 360)); 
drawable.getPaint().setColor(0xffff0000); 
drawable.getPaint().setStrokeWidth(5.0f); 
drawable.setIntrinsicWidth(100); 
drawable.setIntrinsicHeight(100); 
drawable.draw(canvas); 

views.setImageViewBitmap(R.id.ImageView01, bitmap);  
appWidgetManager.updateAppWidget(appWidgetId, views); 

मुझे पता था कि यह इतना आसान नहीं हो सकता है। तो, क्या मैं भी सही दिशा में जा रहा हूं?


अद्यतन

ठीक है, शायद यह है कि बहुत ज्यादा जानकारी नहीं थी। जिस प्रश्न का मैं वास्तव में पूछने की कोशिश कर रहा हूं वह यह है:

अगर मैं विजेट पर आकार आकर्षित करना चाहता हूं, तो क्या मुझे एक छवि दृश्य का उपयोग करना चाहिए और मेरे आकार से एक बिटमैप बनाना चाहिए या विजेट में आकर्षित करने के लिए और अधिक उचित तरीका है यह रिमोट व्यू द्वारा बाधित है?

+0

क्या आप कह रहे हैं कि प्लेसहोल्डर अभी भी कुछ खींचने की कोशिश करते समय वहां है? – sandos

+0

नहीं, प्लेसहोल्डर छवि दूर हो जाती है। यह स्क्रीन पर कुछ भी दृश्य के साथ समाप्त होता है। हालांकि, मैं विजेट पर होल्ड-क्लिक कर सकता हूं और इसे अभी भी हटा सकता हूं। – MojoFilter

उत्तर

8

वास्तव में एसडीके में AnalogClock नामक एक विजेट है जो आप जो करने की कोशिश कर रहे हैं उसके समान ही है।

इसे एक कक्षा के रूप में लागू किया गया है जो View बढ़ाता है और @RemoteView के साथ एनोटेट किया गया है। यह Intent.ACTION_TIME_TICK और Intent.ACTION_TIME_CHANGED पर रिसीवर पंजीकृत करता है और onDraw विधि को ओवरराइड करके स्वयं को आकर्षित करता है। source देखें। मानक AlarmClock एप्लिकेशन exposesthisview एक विजेट के रूप में जो होम स्क्रीन में जोड़ा जा सकता है।

मुझे लगता है कि आपके द्वारा वर्णित किए गए कार्यों को लागू करने के लिए एक अच्छा (यदि सबसे अच्छा नहीं) तरीका है और स्पष्ट रूप से अच्छी तरह से काम करता है।

+0

ओह, ठंडा। मैं इस धारणा के तहत था कि आप एक दृश्य को विस्तारित नहीं कर सकते हैं और इसे रिमोट व्यू में जोड़ सकते हैं क्योंकि रिमोट व्यू, यहां तक ​​कि उप-वर्गों में केवल बहुत विशिष्ट प्रकार की अनुमति थी। अगर यह सब कुछ लेता है, तो मुझे लगता है कि मुझे रॉक और रोल करने में सक्षम होना चाहिए। मैं इसे एक शॉट दूंगा। – MojoFilter

+0

यह प्रलेखन है जिसने मुझे यह इंप्रेशन दिया: http://developer.android.com/guide/topics/appwidgets/index.html#CreatingLayout – MojoFilter

+0

मैंने इसे आजमाया और दुर्भाग्य से आप दृश्य को उपclass नहीं कर सकते हैं और इसे जोड़ सकते हैं एक रिमोट व्यू में उपयोग किया जाने वाला एक लेआउट, जहां तक ​​मैं कह सकता हूं। AnalogClock दृश्य के लिए यह एकमात्र कारण यह है कि एनालॉगक्लॉक उन स्पष्ट रूप से अनुमत घटकों में से एक है। – MojoFilter

0

एक कस्टम घटक बनाने के लिए, मैं व्यू या व्यू के किसी भी उप-वर्ग को बढ़ाऊंगा और अपनी ड्राइंग करने के लिए ऑन ड्रा (कैनवास कैनवास) विधि को ओवरराइड कर दूंगा। कैनवास वस्तु पर आप इस तरह के drawLine(), drawArc(), drawPicture(), drawPoints(), drawText(), drawRect(), आदि के रूप में तरीकों कॉल कर सकते हैं .....

Here's more details.

Here's the api for canvas.

मेरा मानना ​​है कि आप विजेट बनाने के उद्देश्य से रिमोट व्यू में अपना कस्टम व्यू जोड़ सकते हैं।

+0

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

5

यह महान काम करता है:

Paint p = new Paint(); 
p.setAntiAlias(true); 
p.setStyle(Style.STROKE); 
p.setStrokeWidth(8); 
p.setColor(0xFFFF0000); 

Bitmap bitmap = Bitmap.createBitmap(100, 100, Config.ARGB_8888); 
Canvas canvas = new Canvas(bitmap); 
canvas.drawArc(new RectF(10, 10, 90, 90), 0, 270, false, p); 

RemoteViews views = new RemoteViews(updateService.getPackageName(), R.layout.main); 
views.setImageViewBitmap(R.id.canvas, bitmap); 

ComponentName componentName = new ComponentName(updateService, DashboardAppWidgetProvider.class); 
AppWidgetManager appWidgetManager = AppWidgetManager.getInstance(updateService); 
appWidgetManager.updateAppWidget(componentName, views); 

मैं सिर्फ चाप ड्राइंग का तरीका है अपने मूल कोड के साथ समस्या यह अनुमान किया गया था - यही कारण है कि कुछ भी नहीं दिखाया है।

बीटीडब्लू: आप "आर्क घड़ी" की खोज करके बाजार में एक बहुत ही छोटी मेमोरी पदचिह्न के साथ एक अनुकूल "आर्क क्लॉक" पा सकते हैं!