स्पष्टीकरण: नीचे दिया गया उत्तर मान्य है, लेकिन मैं कुछ चीजों को स्पष्ट करना चाहता हूं। मूल समाधान एक दृश्य को वास्तविक दृश्य के साथ एक वास्तविक दृश्य के साथ नकारात्मक ऑफसेट के साथ रखा जाएगा और जैसा कि दिखाया गया है लेआउट में दिखाई देगा।
एक और उपाय है कि अमीर खोरसंडी द्वारा सुझाई गई अनुवाद संपत्ति का उपयोग करें । मैं उस समाधान को एक चेतावनी के साथ सरल पसंद करता हूं: अनुवाद पोस्ट-लेआउट होता है , इसलिए विस्थापित दृश्य के लिए विवश किए गए विचार अनुवाद का पालन नहीं करेंगे।
उदाहरण के लिए, निम्न 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 डेवलपर्स मीडियम ब्लॉग पोस्ट देखें ।
ConstraintLayout
XML के लिए नकारात्मक मार्जिन
<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>