2012-09-04 18 views
11

में आकर्षित नहीं करता है मैं इस तरह एक कस्टम दृश्य CircleView बनाया:कैनवास कस्टम दृश्य

<com.turkidroid.test.CircleView 
     android:id="@+id/circle_view" 
     android:layout_width="fill_parent" 
     android:layout_height="fill_parent" 
     android:layout_centerInParent="true" /> 

हालांकि, कुछ भी नहीं तैयार किया गया था:

public class CircleView extends LinearLayout { 

    Paint paint1; 
    public CircleView(Context context) { 
     super(context); 
     init(); 
    } 
    public CircleView(Context context, AttributeSet attrs) { 
     super(context, attrs); 
     init(); 
    } 
    public void init() { 
     paint1 = new Paint(); 
     paint1.setColor(Color.RED); 
    }  
    protected void onDraw(Canvas canvas) { 
     //super.onDraw(canvas);   
     canvas.drawCircle(50, 50, 25, paint1); 
     this.draw(canvas); 
    } 
} 

तो मैं इसे अपने गतिविधि के लेआउट जड़ <RelativeLayout> पर शामिल!

  • क्या मैं कस्टम दृश्य को लागू कर रहा हूं?
  • या यह है कि मैंने कस्टम व्यू का उपयोग कैसे किया?

कुछ जानकारी:

  • दोनों CircleView और MyActivity एक ही पैकेज में कर रहे हैं: com.turkidroid.test
  • onDraw() विधि में, मैंने super.onDraw() सहित टिप्पणी की और इसे टिप्पणी की।
  • मुझे पता है कि मैं बहुत सरल दृष्टिकोण के साथ एक सर्कल खींच सकता हूं लेकिन मेरा सर्किल व्यू में एक सर्कल ड्राइंग से अधिक होता है। मुझे इसे कस्टम व्यू बनाने की ज़रूरत है।

उत्तर

27

आपकी ऑनड्रा विधि कभी नहीं कहा जाता है, आपको वास्तव में कॉल करने के लिए अपने कस्टम व्यू के कन्स्ट्रक्टर पर setWillNotDraw (false) को कॉल करने की आवश्यकता है।

Android SDK पर कहा गया है:

इस दृश्य में अपने दम पर किसी भी ड्राइंग ऐसा नहीं करता है, तो आगे अनुकूलन अनुमति देने के लिए इस ध्वज की स्थापना की। डिफ़ॉल्ट रूप से, यह ध्वज दृश्य पर सेट नहीं होता है, लेकिन कुछ व्यू उपclasses जैसे ViewGroup पर सेट किया जा सकता है। आमतौर पर, यदि आप ऑन ड्रा (android.graphics.Canvas) को ओवरराइड करते हैं तो आपको यह ध्वज साफ़ करना चाहिए।

+0

यह फेंकता 'java.lang.StackOverflowError' मैं कंस्ट्रक्टर्स के लिए विधि जोड़ा के बाद! कोई विचार? – iTurki

+0

आपके सुझाव से मैंने आपके कोड से super.onDraw() 'पर टिप्पणी नहीं की है, तो आपके सुझाव ने एक आकर्षण की तरह काम किया। धन्यवाद! – iTurki

+0

मुझे यकीन नहीं है कि यह क्या था, मेरा सुपर .न्ड्रा कॉल गायब था और उपरोक्त झंडा भी डिफ़ॉल्ट रूप से सेट किया गया था, लेकिन दोनों जादू में डालने के बाद !!^_^ –

0

आपकी this.draw() विधि कहां है?

यह निश्चित काम करना चाहिए:

protected void onDraw(Canvas canvas) { 
    super.onDraw(canvas);   
    canvas.drawCircle(50, 50, 25, paint1); 
    //this.draw(canvas); where is this method? 
} 
+0

'this.draw()' ['view.draw()'] है (http: //developer.android.com/reference/android/view/View.html#draw%28android.graphics.Canvas%29) विधि। अभी भी काम नहीं किया! – iTurki

+0

मैंने कन्स्ट्रक्टर को 'setWillNotDraw (false)' जोड़ने के बाद, यह काम करता है! मुझे नहीं पता क्यों! – iTurki

+2

यदि आपको कस्टम दृश्य की आवश्यकता है, तो आपको हमेशा से व्यू से विस्तार करना चाहिए और लाइनरलायआउट से नहीं, जब तक आपको वास्तव में विशिष्ट व्यवहार की आवश्यकता न हो। – WarrenFaith

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