2012-10-28 38 views
12

Catch Notes App
एंड्रॉयड सर्किल मेनू पकड़ने की तरह नोट्स

मैं इस ऐप्लिकेशन में की तरह चक्र मेनू करने की कोशिश। android.graphics.Paint और कुछ गणित के साथ android.graphics.Path का उपयोग करके

<RelativeLayout android:id="@+id/bigCircle"> 
<!--color full borders--> 
    <my.custom.component android:id="@+id/middleCircle"> 
    <!--circle for buttons--> 
     <RelativeLayout android:id="@+id/smallCircle"> 
      <!--minus button--> 
     </RelativeLayout> 
    </my.custom.component> 
</RelativeLayout> 

OnDraw में my.custom.component की विधि मैं विभाजित 8 भागों पर सर्कल:

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

उदाहरण के लिए android.graphics.Path द्वारा कैनवास के किसी अन्य भाग से घटक का कैनवास काटने को मैं कैसे हटा सकता हूं।
एक और शब्द में मुझे पता है कि मुझे ड्रॉ विधि में क्या रेड्रो कैनवास करना चाहिए, मुझे पता है कि मैं फ़ोटोशॉप में चित्रित ड्रॉबल्स से कुछ बिटमैप दिखा सकता हूं और कुछ "मल्टीस्क्रीन परेशानी" कर सकता हूं, मुझे पता है कि मैं किस उपयोगकर्ता को दबाए गए हिस्से को निर्धारित कर सकता हूं। लेकिन मुझे नहीं पता कि मैं कैनवास का हिस्सा कैसे चुन सकता हूं और इसे फिर से खींचा सकता हूं।

उत्तर

20

यहां पकड़ने के डेवलपर। अगर मैं आपकी समस्या को समझ रहा हूं, तो आपको अपने परिपत्र मेनू के किसी अनुभाग पर विशेष रूप से हाइलाइट/चयन सूचक को आकर्षित करने में समस्या हो रही है।

हालांकि कई अलग-अलग तरीके हैं जो इसे कार्यान्वित कर सकते हैं, आप किस चीज पर झुका रहे हैं (android.graphics.Path का उपयोग करके) हमने यह कैसे किया। हमारे कैप्चर बटन के दृश्य पदानुक्रम में, एक तत्व है जो कैनवास के रूप में कार्य करता है जिस पर चयन रंग हाइलाइट करता है (यदि वहां एक सक्रिय चयन है) खींचा जाता है।

यदि आपके पास अपने लेआउट में एक समान कस्टम View था, तो आप इस तरह के व्यवहार को डुप्लिकेट कर सकते हैं। सबसे पहले, आपको Path की आवश्यकता होगी जो किसी विशेष सर्कल सेगमेंट के लिए चयन को परिभाषित करता है। Path.addArc(RectF, float, float) इस्तेमाल करते हुए हम पिज्जा टुकड़ा के आकार का पथ प्राप्त कर सकते हैं हम की जरूरत है:

private Path getPathForSegment(float startAngle, float sweep) { 
    Point center = new Point(getWidth()/2, getHeight()/2); 
    RectF rect = new RectF(0f, 0f, getWidth(), getHeight()); 
    Path selection = new Path(); 
    selection.addArc(rect, startAngle, sweep); 
    selection.lineTo(center.x, center.y); 
    selection.close(); 
    return selection; 
} 

getWidth() और ऊपर getHeight() enclosing कस्टम दृश्य वस्तु के लिए हैं, इसलिए वे सीमांकन बॉक्स कि वृत्त चयन है जिस पर शामिल परिभाषित तैयार की।

फिर, अपने कस्टम दृश्य के onDraw(Canvas) में, यदि आपका कोड एक चयन निर्धारित किया है एक खंड के लिए तैयार किया जाना चाहिए:

@Override 
protected void onDraw(Canvas canvas) { 
    // Assume one has the rest of these simple helper functions defined 
    if (shouldDrawSelection()) { 
     float startAngle = getStartAngleOfSelectedSegment(); 
     float sweep = getSweepAngle(); 
     Paint paint = getPaintStyleForSelectedSegment(); 
     Path path = getPathForSegment(startAngle, sweep); 
     canvas.drawPath(path, paint); 
    } 

    // ... 

    super.onDraw(canvas); 
} 

अपने कोड है कि अंतिम रूप ट्रैकिंग कर रहे हैं के अन्य क्षेत्रों में, बस पर invalidate() फोन कस्टम दृश्य ताकि वह इनपुट या स्थिति में परिवर्तनों के आधार पर चयन पथ को फिर से चलाएगा (या नहीं)।

याद रखें कि यह अच्छी आदत है onDraw() में new आईएनजी वस्तुओं से बचने के लिए, इसलिए इन बिल्डिंग ब्लॉक के सबसे (Path रों, Paint रों, आदि) समय से आगे का निर्माण किया जा सकता है (या एक बार, पहली घटना पर) और पुन: उपयोग किया।

आशा है कि यह आप जो पूछ रहे थे उसके करीब है!

+3

अब मैं इस प्रश्न की जांच करने के लिए वापस आ गया हूं। मुझे जवाब मिलने की भी उम्मीद नहीं है, धन्यवाद 'पकड़ने वाले डेवलपर' के लिए बहुत कुछ धन्यवाद। आपने बहुत खूबसूरत ऐप बनाया है। Android समुदाय का समर्थन करने के लिए – Mrusful

+1

+1।रास्ते में अपनी ऐप से प्यार करो। – cgTag