बाधा लेआउट पर ओवरलैप / नकारात्मक मार्जिन कैसे प्राप्त करें?


118

क्या ओवरलैप प्राप्त करने के लिए बाधा लेआउट पर नकारात्मक मार्जिन प्राप्त करना संभव है? मैं एक छवि को लेआउट पर केंद्रित करने की कोशिश कर रहा हूं और एक पाठ दृश्य ऐसा है कि यह एक्स डीपी द्वारा ओवरलैप करता है। मैंने नकारात्मक मार्जिन मान सेट करने की कोशिश की लेकिन कोई भाग्य नहीं। इसे हासिल करने का एक तरीका है तो बहुत अच्छा होगा।


दिशानिर्देश में मदद मिल सकती है, मैंने कोशिश नहीं की है।
यूजेन पिंचेक

जवाबों:


214

स्पष्टीकरण: नीचे दिया गया उत्तर मान्य है, लेकिन मैं कुछ चीजों को स्पष्ट करना चाहता हूं। मूल समाधान एक दृश्य को वास्तविक दृश्य के साथ एक वास्तविक दृश्य के साथ नकारात्मक ऑफसेट के साथ रखा जाएगा और जैसा कि दिखाया गया है लेआउट में दिखाई देगा।

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

उदाहरण के लिए, निम्न XML छवि के नीचे दो TextViews प्रदर्शित करता है । प्रत्येक दृश्य उस दृश्य के साथ ऊपर से नीचे की ओर विवश होता है जो इसके ठीक ऊपर दिखाई देता है।

यहां छवि विवरण दर्ज करें

<androidx.constraintlayout.widget.ConstraintLayout 
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <ImageView
        android:id="@+id/imageView"
        android:layout_width="150dp"
        android:layout_height="150dp"
        android:tint="#388E3C"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent"
        app:srcCompat="@drawable/ic_action_droid" />

    <TextView
        android:id="@+id/sayName"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Say my name."
        android:textAppearance="@style/TextAppearance.AppCompat.Large"
        app:layout_constraintTop_toBottomOf="@+id/imageView"
        app:layout_constraintEnd_toEndOf="@+id/imageView"
        app:layout_constraintStart_toStartOf="@+id/imageView" />

    <TextView
        android:id="@+id/sayIt"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Say it."
        android:textAppearance="@style/TextAppearance.AppCompat.Large"
        app:layout_constraintEnd_toEndOf="@+id/sayName"
        app:layout_constraintStart_toStartOf="@+id/sayName"
        app:layout_constraintTop_toBottomOf="@id/sayName" />
</androidx.constraintlayout.widget.ConstraintLayout>

अब, चलो "मेरा नाम कहो" का अनुवाद करते हैं TextView द्वारा 50dpनिर्दिष्ट द्वारा

android:translationY="-50dp"

यह निम्नलिखित उत्पादन करता है:

यहां छवि विवरण दर्ज करें

"मेरा नाम कहो" TextView अपेक्षा के अनुसार शिफ्ट हो गया है, लेकिन "Say it" TextView ने इसका पालन नहीं किया है जैसा कि हम उम्मीद कर सकते हैं। ऐसा इसलिए है क्योंकि अनुवाद पोस्ट-लेआउट होता है । हालाँकि यह दृश्य पोस्ट-लेआउट को स्थानांतरित करता है, फिर भी इसे नई स्थिति में क्लिक करने योग्य बनाया जा सकता है।

तो, IMO, साथ जाना translationX और translationY में नकारात्मक हाशिए के लिए ConstraintLayout यदि चेतावनी के ऊपर अपने लेआउट प्रभावित नहीं करता; अन्यथा, अंतरिक्ष विजेट के साथ नीचे उल्लिखित के रूप में जाना ।


मूल उत्तर

यद्यपि यह प्रकट नहीं होता है कि नकारात्मक मार्जिन का समर्थन किया जाएगा ConstraintLayout, लेकिन उपलब्ध और समर्थित उपकरणों का उपयोग करके प्रभाव को पूरा करने का एक तरीका है। यहां एक छवि है जहां छवि शीर्षक छवि 22dpके नीचे से ओवरलैप किया गया है - प्रभावी रूप से एक -22dpमार्जिन:

यहां छवि विवरण दर्ज करें

यह Spaceउस ऑफसेट के बराबर विजेट के साथ एक विजेट का उपयोग करके पूरा किया गया, जो आप चाहते हैं। Spaceविजेट तो इसकी तल के नीचे करने के लिए विवश है ImageView। अब आपको बस इतना करना होगा TextViewकि इमेज टाइटल के साथ Spaceविजेट के निचले भाग में ऊपर को कसना है। TextViewके तल पर तैनात किया जाएगा Spaceदृश्य मार्जिन कि स्थापित किया गया था अनदेखी।

निम्नलिखित एक्सएमएल है जो इस प्रभाव को पूरा करता है। मैं ध्यान दूंगा कि मैं इसका उपयोग करता हूं Spaceक्योंकि यह इस प्रकार के उपयोग के लिए हल्का और इरादा है, लेकिन मैं दूसरे प्रकार का उपयोग कर सकता था Viewऔर इसे अदृश्य बना सकता था। (आप शायद समायोजन करने के लिए, हालांकि की आवश्यकता होगी।) तुम भी एक निर्धारित कर सकते हैं Viewशून्य मार्जिन और इनसेट मार्जिन आप चाहते हैं की ऊंचाई के साथ, और के शीर्ष विवश TextViewइनसेट के शीर्ष करने के View

फिर भी एक और दृष्टिकोण ओवरले करने के लिए किया जाएगा TextViewके शीर्ष पर ImageViewसंरेखित सबसे ऊपर / नीचे / lefts / सही और मार्जिन के लिए उपयुक्त समायोजन करने / गद्दी से। नीचे प्रदर्शित दृष्टिकोण का लाभ यह है कि बहुत अधिक गणना के बिना एक नकारात्मक मार्जिन बनाया जा सकता है। यह सब कहना है कि इसके लिए कई तरीके हैं।

अपडेट: इस तकनीक की त्वरित चर्चा और डेमो के लिए, Google डेवलपर्स मीडियम ब्लॉग पोस्ट देखें

ConstraintLayoutXML के लिए नकारात्मक मार्जिन

<android.support.constraint.ConstraintLayout
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <ImageView
        android:id="@+id/imageView"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginTop="32dp"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toRightOf="parent"
        app:layout_constraintTop_toTopOf="parent"
        app:srcCompat="@mipmap/ic_launcher" />

    <android.support.v4.widget.Space
        android:id="@+id/marginSpacer"
        android:layout_width="0dp"
        android:layout_height="0dp"
        android:layout_marginBottom="22dp"
        app:layout_constraintBottom_toBottomOf="@+id/imageView"
        app:layout_constraintLeft_toLeftOf="@id/imageView"
        app:layout_constraintRight_toRightOf="@id/imageView" />

    <TextView
        android:id="@+id/editText"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Say my name"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toRightOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/marginSpacer" />
</android.support.constraint.ConstraintLayout>

मेरे मामले में काम नहीं कर रहा है, ImageViewमाता-पिता पर केंद्रित है, TextViewऊपर से ओवरलैप है ImageView। तब Spaceत्रुटि तब होती है जब ऐप बैकग्राउंड से वापस आता है। मुझे लगता है कि 0dp, 0dp कुछ परेशानी देता है। क्या सिर्फ उपयोग के बारे में Guideline
illusionJJ

इस तरह से देखने के लिए काम नहीं कर सकते हैं माता पिता के साथ बाधाओं है।
R4j

मुझे स्पेस की आवश्यकता क्यों है? मैंने बिना जगह की कोशिश की और मैं एक ही परिणाम है।
कुज्डू

@kuzdu यहां बिंदु यह है कि छवि के नीचे अंतरिक्ष का तल विवश है। मार्जिन अंतरिक्ष को ऊपर ले जाता है, और फिर पाठ दृश्य के शीर्ष को अंतरिक्ष के तल पर विवश किया जाता है जो इसे "आधा" बनाता है। "प्रभाव हम प्राप्त करने की कोशिश कर रहे हैं। यदि आपने इसे एक स्थान के बिना प्राप्त करने में कामयाबी पाई है तो कृपया यहाँ एक उत्तर पोस्ट करें ताकि हम आपके दो विचारों पर इस्तेमाल होने वाली बाधाओं को देख सकें।
लुकास पी।

यू आर हाइजेनबर्ग ...
नाहरो

62

एक अन्य तरीका इस तरह का उपयोग translationXकर रहा translationYहै:

  <ImageView
                android:layout_width="wrap_content"
                android:layout_height="wrap_content" 
                android:translationX="25dp"
                app:layout_constraintRight_toRightOf="parent"
                app:layout_constraintBottom_toBottomOf="parent"/>

यह काम करेगा android:layout_marginRight="-25dp"


29
इस बात से अवगत रहें, क्योंकि दृश्य की वास्तविक स्थिति मूल स्थिति (अनुवाद से पहले) पर रहती है, इसका केवल अनुवाद किया जाएगा। जिससे ऑनक्लिक इवेंट्स केवल पुरानी स्थिति के भीतर से चालू हो जाएंगे।
गोएमिक

@ goemic का कथन गलत प्रतीत होता है, क्योंकि यह एक tween एनीमेशन नहीं है, बल्कि एक प्रोपर्टी एनीमेशन है। (कृपया मुझे सही करें अगर मैं गलत हूं)
हेनरी

बुरा अभ्यास क्योंकि यह RTL लेआउट का समर्थन नहीं करता है
सलाम एल-बन्ना

27

RelativeLayout में नकारात्मक मार्जिन का कभी आधिकारिक समर्थन नहीं किया गया। कांस्ट्रेनल लयआउट में नकारात्मक मार्जिन का समर्थन नहीं किया जाएगा। [...]

- 8 जून 2016 को रोमेन गाइ

इन दो मुद्दों का पालन करें:

https://code.google.com/p/android/issues/detail?id=212499 https://code.google.com/p/android/issues/detail?id=234866


उनका विचार यह हो सकता है कि बाधा के साथ आपको नकारात्मक मार्जिन की आवश्यकता नहीं है। यह सच हो सकता है यदि आपके पास एक लेआउट पर सभी तत्व हैं। कभी-कभी यद्यपि आप बटन से बने कमांड स्ट्रिप में तार्किक रूप से तत्वों को समूहित करना चाहते हैं, जिसमें पुन: प्रयोज्यता और स्पष्टता और इनकैप्सुलेशन के अपने फायदे हैं। उस बिंदु पर समूह का एक आयताकार आकार होगा, और यह उस आकार पर यह सीमा है जो नकारात्मक मार्जिन को फिर से उपयोगी और आवश्यक बनाता है।
एंड्रयूब्लूम

नकारात्मक मार्जिन पाठ पर आधार रेखा की समान अवधारणा का अनुकरण करते हैं, एक आयताकार कंटेनर के भीतर एक जटिल आकार का पाठ होने के नाते
एंड्रयूब्लूम

14

यह वही है जो मैं एक समाधान खोजने की कोशिश करने के घंटों के बाद पता लगा।

आइए हम दो छवियों, छवि 1 और छवि 2 पर विचार करें। Image2 को नीचे दाईं ओर स्थित image1 के शीर्ष पर रखा जाना है।

ओवरलैपिंग दृश्य उदाहरण छवि

अतिव्यापी विचारों के लिए हम स्पेस विजेट का उपयोग कर सकते हैं ।

क्रमशः छवि 1 के चार पक्षों के साथ अंतरिक्ष विजेट के चार पक्षों को कसना। इस उदाहरण के लिए, अंतरिक्ष विजेट के दाईं ओर के साथ छवि 2 के बाईं ओर और अंतरिक्ष विजेट के नीचे की ओर के साथ छवि 2 के ऊपर की ओर कसना। यह इमेज विजेट को स्पेस विजेट के साथ टाई करेगा और चूँकि स्पेस विजेट सभी तरफ से विवश है, हम आवश्यक क्षैतिज या ऊर्ध्वाधर पूर्वाग्रह को परिभाषित कर सकते हैं जो आवश्यकतानुसार इमेज 2 को स्थानांतरित करेगा।

<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout 
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".Player">
 <ImageView
     android:id="@+id/image1"
     android:layout_width="250dp"
     android:layout_height="167dp"
     android:src="@android:color/holo_green_dark"
     app:layout_constraintEnd_toEndOf="parent"
     app:layout_constraintStart_toStartOf="parent"
     app:layout_constraintTop_toTopOf="parent" />
 <Space
     android:id="@+id/space"
     android:layout_width="wrap_content"
     android:layout_height="wrap_content"
     app:layout_constraintBottom_toBottomOf="@+id/image1"
     app:layout_constraintEnd_toEndOf="@+id/image1"
     app:layout_constraintHorizontal_bias="0.82"
     app:layout_constraintStart_toStartOf="@+id/image1"
     app:layout_constraintTop_toTopOf="@+id/image1"
     app:layout_constraintVertical_bias="0.62" />
 <ImageView
     android:id="@+id/image2"
     android:layout_width="82dp"
     android:layout_height="108dp"
     android:src="@android:color/holo_green_light"
     app:layout_constraintStart_toEndOf="@+id/space"
     app:layout_constraintTop_toBottomOf="@+id/space" />
 </android.support.constraint.ConstraintLayout>

इसके अतिरिक्त, इमेज 1 के केंद्र-तल पर इमेज 2 की स्थिति के लिए, हम इमेज 2 के बाएं और दाएं पक्षों को क्रमशः स्पेस विजेट के बाएं और दाएं पक्षों के साथ जोड़ सकते हैं। इसी प्रकार, हम image2 को Space विजेट के साथ image2 की बाधाओं को बदलकर कहीं भी रख सकते हैं।


जवाब के लिए धन्यवाद!
user3193413

11

मुझे इसे बहुत सरल करने का एक तरीका मिला।

मूल रूप से ImageView है, तो पाठ दृश्य पर छवि के शीर्ष बाधा से मेल करने के लिए शीर्ष बाधा जोड़ें और -ve मार्जिन प्रकार के व्यवहार को प्राप्त करने के लिए TextView के मार्जिन शीर्ष को मैच के लिए जोड़ें।


9
जब तक छवि की ऊँचाई परिवर्तनशील न हो
Stas Shusha

यह अभी भी काम करेगा। आपको बस इस बात से सावधान रहने की आवश्यकता है कि आप छवि को ओवरले करने के लिए अपने ऊपरी विजेट को कहाँ चाहेंगे, दाईं ओर या नीचे से मार्जिन सेट करना एक बेहतर विकल्प हो सकता है, या आप पूर्वाग्रह का उपयोग कर सकते हैं, जो सभी प्रश्न का उत्तर देते हैं ।
गेब्रियल वास्कोनसेलोस

4

यह कई मदद करेगा

मेरे मामले में मुझे अपना डिजाइन इस तरह चाहिए:

उपरांत

मेरा मतलब है कि मेरी छवि उनकी चौड़ाई का आधा हिस्सा है, इसलिए मूल रूप से मुझे वास्तविक छवि चौड़ाई के आधे के नकारात्मक मार्जिन की आवश्यकता है, लेकिन बाधा लेआउट और बाधा लेआउट में मेरे पूरे लेआउट को नकारात्मक मार्जिन की अनुमति नहीं है, इसलिए मैंने इसे नीचे दिए गए कोड के साथ हासिल किया

<androidx.constraintlayout.widget.ConstraintLayout
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <ImageView
        android:layout_width="100dp"
        android:layout_height="100dp"
        android:scaleType="centerCrop"
        android:src="@drawable/ic_launcher_background"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toStartOf="@id/guideline"
        app:layout_constraintTop_toTopOf="parent" />

    <androidx.constraintlayout.widget.Guideline
        android:id="@+id/guideline"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:orientation="vertical"
        app:layout_constraintGuide_begin="50dp" />
</androidx.constraintlayout.widget.ConstraintLayout>

ताकि ImageView दिशानिर्देश की शुरुआत में समाप्त हो जाएगा। और प्रभाव 50dp की शुरुआत में नकारात्मक मार्जिन की तरह है।

और यह भी कि यदि आपके दृश्य की चौड़ाई निश्चित नहीं है और यह प्रतिशत में है ताकि आप प्रतिशत के साथ दिशानिर्देश रख सकें और जो भी प्रभाव चाहें प्राप्त कर सकें

हैप्पी कोडिंग :)


0

आपको केवल अपने लेआउट में स्पेस विजेट का उपयोग करने की आवश्यकता है

<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent">

<Space
    android:id="@+id/negative_margin"
    android:layout_width="16dp"
    android:layout_height="16dp"
    app:layout_constraintTop_toTopOf="parent"
    app:layout_constraintRight_toLeftOf="parent"/>

<Button
    android:id="@+id/button"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="Widget who needs negative margin"
    app:layout_constraintTop_toBottomOf="@+id/negative_margin"
    app:layout_constraintLeft_toLeftOf="@+id/negative_margin" />


0

यह एक बहुत पुराना सवाल है, जो अभी तक बहुत पूछा गया है, इसे प्राप्त करने का सबसे तेज़ तरीका उस तरफ के ऊपर और नीचे को कसना है जिससे आप लंगर डालना चाहते हैं, जैसे:

        <androidx.appcompat.widget.AppCompatImageView
        android:layout_width="55dp"
        android:layout_height="55dp"
        app:layout_constraintBottom_toBottomOf="@+id/parent_view_id"
        app:layout_constraintTop_toBottomOf="@+id/parent_view_id"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintHorizontal_bias="0.5"
        app:layout_constraintStart_toStartOf="parent" />

यह इसे क्षैतिज रूप से केंद्रित, दृश्य की निचली पंक्ति में केंद्रित करेगा।


-1

एक सरल तरीका।

मुझे यकीन नहीं है कि सबसे अच्छा तरीका है।

बस LinearLayout का उपयोग कर लपेटें

<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
>
 <View
 android:layout_width="wrap_content"
 android:layout_marginLeft="-20dp"
 android:layout_height="wrap_content"/>
</LinearLayout>

यह थोड़ा और घोंसला जोड़ता है, लेकिन यह अन्य समाधानों के विपरीत, शीर्ष से बाहर के दृश्यों को एनिमेट करने के लिए काम करता है, जो यह मानते हैं कि व्यू पूरी तरह से दिखाया जाएगा। धन्यवाद!
सिंह

2
इस उत्तर के लिए बहुत अधिक जानकारी की आवश्यकता है। ओवरलैप को पूरा करने के लिए एक रेखीय लाईट में कुछ कैसे रखा जाए, यह स्पष्ट न करें।
रॉबर्ट
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.