2012-02-20 16 views
10

के आसपास गतिशील रूप से बटन व्यवस्थित करें मैं अभी भी एंड्रॉइड के लिए नया हूं इसलिए मैं सभी दृश्य घटकों से पूरी तरह से परिचित नहीं हूं। मैं एक सर्कल के चारों ओर गतिशील बटन को संरेखित करने के साथ संघर्ष कर रहा हूं।एक सर्किल

क्या मैं प्राप्त करने के लिए कोशिश कर रहा हूँ एक राय यह है कि संलग्न छवि की तरह नज़र एन बटन जोड़ने (एन निर्माण समय बदल सकते हैं) है:

मैं absoluteLayout का उपयोग कर से बचना चाहते हैं (लेकिन अगर मैं इसे हल करने का एकमात्र तरीका हूं तो मैं सुझावों के लिए खुला हूं)।

int iNumberOfButtons = 10; 
double dIncrease = Math.PI * 2/iNumberOfButtons, 
    dAngle = 0, 
     x = 0, 
     y = 0; 

    for(int i = 0; i < iNumberOfButtons; i++) 
    { 
    x = 100 * Math.cos(dAngle) + 200; 
    y = 100 * Math.sin(dAngle) + 200; 
    dAngle += dIncrease; 
    // get button and set position? 
    } 

मैं एक कस्टम दृश्य के अंदर से लेकिन से इस कोड का उपयोग के बारे में सोचा था कि मैं क्या देखा है: मैं पहले से ही बटन के लिए x/y पदों के लिए एक गणना (अब के लिए बटन आकार अनदेखी) के साथ आया था व्यू ग्रुप से व्यूग्रुप को व्यूव्यू विधि के लिए उप-वर्गीकृत करने की आवश्यकता है और फिर फिर पूर्णतया केवल एक्स, वाई पदों को सेट करने की अनुमति देता है ... मुझे इस सुविधा को कार्यान्वित करने का नुकसान हुआ है।

मैं बाद में उस दृश्य में कुछ एनिमेशन जोड़ सकता हूं, इसलिए यदि संभव हो तो SurfaceView का उपयोग करना अच्छा हो सकता है लेकिन यह एक आवश्यकता नहीं है।

उत्तर

3

मुझे लगता है कि मुझे वह समाधान मिला जो मैंने प्राप्त करने का प्रयास किया था।

मैं अपना खुद का दृश्य रिलेवेटिवआउट को उप-वर्गीकृत करता हूं। ऑनक्रेट() में मैंने

setWillNotDraw(false); 

सेट किया है ताकि ऑनड्रा() को कॉल किया जा सके। मैं तो OnDraw() में जारी:

int iHeight = getHeight(); 
int iWidth = getWidth(); 
int iNumberOfButtons = 10; 
double dIncrease = Math.PI * 2/iNumberOfButtons, 
     dAngle = 0, 
     x = 0, 
     y = 0; 

    for(int i = 0; i < iNumberOfButtons; i++) 
    { 
    x = 200 * Math.cos(dAngle) + iWidth/2; 
    y = 200 * Math.sin(dAngle) + iHeight/2; 
    dAngle += dIncrease; 
    Button xButton = new Button(m_xContext); 
    xButton.setAdjustViewBounds(true); 
    xButton.setBackgroundResource(R.drawable.some_image); 
    LayoutParams xParams = (RelativeLayout.LayoutParams)xButton.getLayoutParams(); 
    if(xParams == null) 
    { 
     xParams = new RelativeLayout.LayoutParams(xButton.getBackground().getIntrinsicWidth(), xButton.getBackground().getIntrinsicHeight()); 
    } 
    xParams.leftMargin = (int)x - (xButton.getBackground().getIntrinsicWidth()/2) ; 
    xParams.topMargin = (int)y - (xButton.getBackground().getIntrinsicHeight()/2); 
    addView(xButton, xParams); 
    } 

यह मैं वांछित परिणाम देता है, लेकिन लगता है LayoutParams का प्रारंभ करने (और सबसे अधिक संभावना है) गलत। क्या ऐसा करने के लिए इससे अच्छा तरीका है?

+0

मैं इस दृष्टिकोण के साथ एक और मुद्दे में भाग रहा हूँ। ऑन ड्रा() को बार-बार कहा जाता है जो वहां बटन सेट करते समय मैं नहीं चाहता हूं। मुझे लगता है कि मैं संभवतः एक if और एक बुलियन के साथ प्रारंभिक घेरे को घेर सकता है, लेकिन क्या व्यवहार मैं लागू करने के लिए एक स्वीकार्य तरीका है? (उदा। बटन के साथ मेरा कस्टम व्यू इनिट करें, बिना किसी ड्राफ्ट के केंद्र के एक सर्कल में रखे गए हैं?) –

0

पूर्ण लेआउट के बजाय आप रिलेवेटिवआउट और बच्चे के दृश्य का उपयोग कर सकते हैं, ऊपर और बाएं मार्जिन सेट कर सकते हैं। कुछ ऐसा:

RelativeLayout.LayoutParams params = (RelativeLayout.LayoutParams) view.getLayoutParams(); 
params.leftMargin = x; 
params.topMargin = y; 
+0

एक अच्छा विचार है कि, आपके सुझाव को प्राप्त होता है कि मैं क्या करने की कोशिश कर रहा था। मैंने इसके लिए RelativeLayout subclassed और CREate में बटन बनाएँ। हालांकि उनके लेआउट पैराम (और खुद को देखने वाले लोग) इस बिंदु पर शून्य हैं। उन्हें शुरू करने का पसंदीदा तरीका क्या है? एक अन्य आवश्यकता जिसे मैं उल्लेख करना भूल गया था वह यह है कि सर्कल को दृश्य के केंद्र में रखा जाना चाहिए। मैंने सोचा कि मुझे GetHeight() और getWidth() से प्राप्त मूल्यों को केवल ऑफसेट करने के लिए आसान होगा, लेकिन दोनों विधियां 0 लौटती हैं (जैसा कि प्राप्त किया गया है WidethWidth() और ऊंचाई)। ठीक करने के लिए कोई रास्ता है? –

2

निम्नलिखित Apache 2.0 लाइसेंस परियोजना सेवा की हो सकती है: https://github.com/dmitry-zaitsev/CircleLayout

+0

मैं चाहता हूं कि बटन ईवेंट पर क्लिक करें लेकिन मैं नहीं ढूंढ पा रहा हूं। – ashokk

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