2012-10-24 14 views
35
public class MainActivity extends Activity { 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     TableView tv = new TableView(this); 
     tv.setLayoutParams(new LayoutParams(LayoutParams.MATCH_PARENT,LayoutParams.MATCH_PARENT)); 
     setContentView(tv);  
    } 

    @Override 
    public boolean onCreateOptionsMenu(Menu menu) { 
     getMenuInflater().inflate(R.menu.activity_main, menu); 
     return true; 
    } 
} 

public class TableView extends ViewGroup { 
    private Paint oval; 
    private RectF rect; 

    public TableView(Context context) { 
     super(context); 
     oval= new Paint(Paint.ANTI_ALIAS_FLAG); 
     oval.setColor(Color.GREEN); 
    } 


    public void onDraw(Canvas canvas) { 
     super.onDraw(canvas); 
     canvas.drawOval(rect , oval); 
    } 
    @Override 
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { 
     super.onMeasure(widthMeasureSpec, heightMeasureSpec); 
     int wspec = MeasureSpec.makeMeasureSpec(
       getMeasuredWidth(), MeasureSpec.EXACTLY); 
     int hspec = MeasureSpec.makeMeasureSpec(
       getMeasuredHeight(), MeasureSpec.EXACTLY); 
     for(int i=0; i<getChildCount(); i++){ 
      View v = getChildAt(i); 
      v.measure(wspec, hspec); 
     } 
    } 


    @Override 
    protected void onLayout(boolean changed, int l, int t, int r, int b) { 
     float w=r-l; 
     float h=b-t; 
     rect=new RectF(w/8,h/8,7*w/8,7*h/8); 
     float theta = (float) (2 * Math.PI/getChildCount()); 
     for(int i=0; i< getChildCount(); i++) { 
      View v = getChildAt(i); 
      w = (rect.right-rect.left)/2; 
      h = (rect.bottom-rect.top)/2; 
      float half = Math.max(w, h)/2; 
      float centerX = rect.centerX()+w*FloatMath.cos(theta); 
      float centerY = rect.centerY()+h*FloatMath.sin(theta); 
      v.layout((int)(centerX-half),(int)(centerY-half),(int)(centerX+half),(int)(centerY+half)); 
     } 
    } 
} 

कहा जाता हो जाता है कभी नहीं वैसे वहाँ लगभग कोई अच्छा और गहरी ट्यूटोरियल और शायद ही कस्टम लेआउट सही करने के लिए पर डेटा के किसी भी भाग रहे हैं, तो मैं कैसे अपनी किया यह पता लगाने की कोशिश की, क्या मैं लागू करने की कोशिश कर रहा हूं एक लेआउट है जो स्क्रीन के केंद्र में एक हरा अंडाकार चित्रित करता है, और मैं चाहता हूं कि इस लेआउट के हर बच्चे को अंडाकार के चारों ओर बाहर रखा जाए।एंड्रॉयड कस्टम लेआउट - OnDraw()

आप उस अंडाकार को पोकर टेबल के रूप में सोच सकते हैं जो मैं चाहता हूं कि इस लेआउट के बच्चे इसके आस-पास बैठ जाएं।

क्या वर्तमान में इस कोड से होता है कि मैं कोई अंडाकार के साथ एक सफेद एप्लिकेशन scren मिलता है, इसलिए मैं इसे डिबग और देखा OnDraw कहा जाता हो जाता है कभी नहीं है कि ...

3 प्रश्न:

  1. क्यों क्या चल रहा है?
  2. एसडीके मुझे चेतावनी देता है कि मुझे ऑनआउट विधि के भीतर नई ऑब्जेक्ट्स आवंटित नहीं करनी चाहिए, तो मुझे रेक्टएफ की गणना कहां करनी चाहिए ताकि यह आने वाले कॉल के लिए तैयार हो?
  3. super.onDraw() को कॉल करने से सभी बच्चे खुद को पेंट कर देंगे? या मुझे स्पष्ट रूप से उनके ड्रा() को आमंत्रित करना चाहिए?

यदि मुझे यह सब गलत लगता है और आप लोग मुझे सही दिशा में मार्गदर्शन कर सकते हैं, या इस विषय से संबंधित उदाहरण या ट्यूटोरियल के लिए कोई लिंक है जो सहायक भी होगा!

उत्तर

119

डिफ़ॉल्ट रूप से, onDraw()ViewGroup वस्तुओं के लिए नहीं कहा जाता है। इसके बजाय, आप dispatchDraw() ओवरराइड कर सकते हैं।

वैकल्पिक रूप से, आप अपने TableView कन्स्ट्रक्टर में setWillNotDraw(false) पर कॉल करके ViewGroup ड्राइंग सक्षम कर सकते हैं।

देखें: Romain Guy's explanation

संपादित करें:

# 2 के लिए: - यह निर्माता में प्रारंभ, तो बस अपने onLayout() विधि में rect.set() कहते हैं।

# 3: के लिए - हाँ, जहां तक ​​मुझे पता है कि सुपर कॉल इसे संभाल लेगा, आपको तब तक इसे संभालना नहीं चाहिए जब तक आपको बच्चों को तैयार करने के तरीके को अनुकूलित करने की आवश्यकता न हो।

+0

महान है कि काम किया, धन्यवाद !, और क्या मेरी अन्य प्रश्न के बारे में? –

+0

@kcoppock
उल्लिखित विधि का नाम ** ** ** setWillNotDrawEnabled' नहीं है, लेकिन बस 'setWillNotDraw' ('View'class की सार्वजनिक विधि) है। – lambruscoAcido

0

अगर आप चाहते हैं कि कैनवास फिर से ड्रा कॉल रद्द() होना है, और विधि OnDraw() फिर से निष्पादित किया जाएगा