2010-12-01 17 views
21

मैं सेटअप निम्नलिखित drawable पृष्ठभूमि के साथ एक LinearLayout है:एंड्रॉयड एक्सएमएल काटा कोने गोल

<?xml version="1.0" encoding="utf-8"?> 
<shape xmlns:android="http://schemas.android.com/apk/res/android"> 
    <corners android:radius="10dp" /> 
    <solid android:color="#CCFFFFFF"/> 
</shape> 

समस्या मैं आ रही LinearLayout के भीतर है मैं एक LinearLayout तत्व है कि यह के तल पर बैठता है माता पिता है है । चूंकि इसमें गोलाकार कोनों नहीं हैं, इसके कोनों माता-पिता के नीचे बाएं और दाएं कोनों से आगे बढ़ते हैं। डिवाइस पर http://kttns.org/hn2zm गैर कतरन अधिक स्पष्ट है:

बाल LinearLayout पर drawable पृष्ठभूमि इस तरह दिखता है:

<?xml version="1.0" encoding="utf-8"?> 
<bitmap 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    android:src="@drawable/pedometer_stats_background" 
    android:tileMode="repeat" 
/> 

इस मुद्दे को इस तरह दिखता है।

क्लिपिंग को पूरा करने के लिए सबसे अच्छी विधि क्या है?

+2

मुझे लगता है कि इसे पैडिंग और मार्जिन के चालाक उपयोग के साथ हल किया जाएगा – schwiz

उत्तर

6

क्या इस तरह से अपनी ध्वनियों का वर्णन:

<LinearLayout android:shape="rounded"> 
    <LinearLayout android:background="@drawable/pedometer_stats_background"> 
    </LinearLayout> 
</LinearLayout> 

और आंतरिक लेआउट गोलाकार कोनों के बाहर धक्का है, क्योंकि यह गोल नहीं है। आपको अपने बिटमैप के कोनों को गोल करना होगा। यदि आपके पास दोहराने वाला बिटमैप है तो आप नौ-पैच को खींचने योग्य को परिभाषित करना चाहते हैं। अपने कोनों को गोल करें, फिर ग्राफिक के हिस्से को परिभाषित करें जो विस्तार कर सकता है।

http://developer.android.com/guide/topics/resources/drawable-resource.html#Shape

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

+0

इसके लिए धन्यवाद, मैं बिटमैप्स को आकार देने के बिना दूर जाने की कोशिश कर रहा था। विश्वास नहीं कर सकते कि आप बच्चों को खून बहने से रोक नहीं सकते हैं। – sgarman

+0

ठीक है आप उन्हें रोक सकते हैं, लेकिन यह बॉक्स से बाहर नहीं है। थोड़ा कोड और सरलता के साथ आप कुछ ऐसा कर सकते हैं जो ऐसा करता है। – chubbsondubs

26

मुझे उनके पीछे एक भूरे रंग की पृष्ठभूमि के साथ आईफोन-शैली गोलाकार लेआउट की आवश्यकता थी। (श्वास - हमेशा आईफोन की प्रतिलिपि)

मैं निराश था मुझे एक लेआउट मास्क करने का कोई तरीका नहीं मिला। यहां अधिकांश उत्तर पृष्ठभूमि छवि का उपयोग करने के लिए कहते हैं, लेकिन यह मेरी आवश्यकता नहीं है।


संपादित: पिछला जवाब एक FrameLayout का उपयोग करने और android:foreground drawable स्थापित करने का सुझाव दिया। इसने दृश्य में कुछ अजीब पैडिंग पेश की। मैंने सरल उत्तर RelativeLayout तकनीक का उपयोग करने के लिए अपना उत्तर अपडेट किया है।


चाल RelativeLayout का उपयोग करना है; इसके अंदर अपना लेआउट रखें। अपने लेआउट के नीचे, एक और ImageView जोड़ें, इसे background पर एक उपयुक्त मास्किंग छवि फ्रेम पर सेट करें। यह आपके अन्य लेआउट के शीर्ष पर आकर्षित करेगा।

मेरे मामले में, मैंने 9 पैच फ़ाइल बनाई जो एक भूरे रंग की पृष्ठभूमि थी, जिसमें पारदर्शी गोलाकार आयत से इसकाटा गया था।

frame

यह आपके अंतर्निहित लेआउट के लिए एकदम सही मुखौटा बनाता है।

XML कोड से कम है - यह एक सामान्य लेआउट एक्सएमएल फ़ाइल है:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_height="wrap_content" android:layout_width="fill_parent"> 

    <!-- this can be any layout that you want to mask --> 
    <LinearLayout android:id="@+id/mainLayout" 
     android:layout_height="wrap_content" 
     android:layout_width="fill_parent" android:orientation="vertical" 
     android:background="@android:color/white"> 

     <TextView android:layout_height="wrap_content" 
      android:layout_width="wrap_content" android:layout_gravity="center" 
      android:text="Random text..." /> 

    </LinearLayout> 

    <!-- FRAME TO MASK UNDERLYING VIEW --> 
    <ImageView android:layout_height="fill_parent" 
     android:layout_width="fill_parent" 
     android:background="@drawable/grey_frame" 
     android:layout_alignTop="@+id/mainLayout" 
     android:layout_alignBottom="@+id/mainLayout" /> 

</RelativeLayout> 

नोट तल पर ImageView, मुख्य लेआउट के अनुरूप शीर्ष & नीचे, मास्किंग छवि सेट के साथ:

  • android:background="@drawable/grey_frame"

इस संदर्भ देता है मेरी 9Patch फ़ाइल - और मास्क अंतर्निहित लेआउट अग्रभूमि में खींचा जा रहा है।

यहां एक उदाहरण है जो एक मानक लेआउट पर ग्रे गोलाकार कोनों दिखा रहा है।

maskedLayout

hth

+2

मैंने ListViews पर गोलाकार कोनों के लिए कई दृष्टिकोणों की कोशिश की है और यह निश्चित रूप से सबसे विश्वसनीय है। एक जादू की तरह काम करता है। धन्यवाद! – jenzz

+1

यह निश्चित रूप से सबसे अच्छा तरीका है। इसके अलावा यह आपके डिजाइनरों को पागल हो जाता है और गोलाकार कोनों में ड्रॉप छाया/चमक जोड़ता है और आपको कुछ पागल ड्राइंग या कुछ भी करने की ज़रूरत नहीं है। – phreakhead

+3

मुझे "हमेशा आईफोन से कॉपी करने" के साथ मजा आया था। सच है! :( – princepiero

3

एपीआई स्तर 21 (जेलीबीन) View.setClipToOutline गयी। Defining Shadows and Clipping Views पर Android दस्तावेज़ से:

एक drawable के आकार के लिए एक दृश्य क्लिप करने के लिए, दृश्य की पृष्ठभूमि के रूप drawable सेट ... और View.setClipToOutline() विधि कहते हैं।

मैंने पेरेंट व्यू की पृष्ठभूमि को कोने त्रिज्या के साथ ग्रेडियेंट ड्राउबल में सेट करके इसका परीक्षण किया, और बच्चे के दृश्य माता-पिता के समान गोलाकार कोनों से मेल खाने के लिए सही ढंग से फसल किए जाते हैं।

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