বাধা লেআউটে ওভারল্যাপ / নেতিবাচক মার্জিন কীভাবে অর্জন করবেন?


118

ওভারল্যাপটি অর্জনের জন্য কি বাঁধা লেআউটে নেতিবাচক মার্জিন অর্জন করা সম্ভব? আমি লেআউটটিকে কেন্দ্র করে একটি চিত্র রাখার চেষ্টা করছি এবং একটি টেক্সট ভিউ রাখব যাতে এটি এক্স বাই দিয়ে আড়াআড়ি হয়। আমি নেতিবাচক মার্জিন মান সেট করার চেষ্টা করেছি তবে ভাগ্য নেই। এটি অর্জনের কোনও উপায় থাকলে এটি দুর্দান্ত হবে।


গাইডলাইন সাহায্য করতে পারে, আমি চেষ্টা করি নি।
ইউজেন পেচানেক

উত্তর:


214

স্পষ্টকরণ: নীচের উত্তরটি বৈধ থাকবে, তবে আমি কয়েকটি বিষয় পরিষ্কার করতে চাই। মূল সমাধানটি উল্লিখিত হিসাবে অন্য মতামতের সাথে সম্মতিযুক্ত ডি ফ্যাকো নেগেটিভ অফসেটের সাথে একটি ভিউ স্থাপন করবে এবং প্রদর্শিত লেআউটে প্রদর্শিত হবে।

আরেকটি সমাধান হ'ল এখানে আমির খোরসান্দি পরামর্শ অনুসারে ট্রান্সলেশনওয়াই সম্পত্তি ব্যবহার করুন । আমি সেই সমাধানটিকে একটি ক্যাভিয়েটের সাথে সহজ হিসাবে পছন্দ করি: অনুবাদটি পোস্ট-লেআউট পরে ঘটে , সুতরাং বাস্তুচ্যুত দৃষ্টিতে সীমাবদ্ধ এমন দর্শনগুলি অনুবাদটি অনুসরণ করে না।

উদাহরণস্বরূপ, নীচের এক্সএমএলটি চিত্রের নীচে দুটি টেক্সটভিউ প্রদর্শন করে। প্রতিটি দৃশ্যের উপরে তত্ক্ষণাত দৃশ্যের সাথে তত্ক্ষণাত প্রদর্শিত হয় view

এখানে চিত্র বর্ণনা লিখুন

<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>

এখন, নির্দিষ্ট করে "আমার নাম বলুন" পাঠ্য ভিউ অনুবাদ করুন50dp

android:translationY="-50dp"

এটি নিম্নলিখিত উত্পাদন করে:

এখানে চিত্র বর্ণনা লিখুন

"আমার নাম বলুন" টেক্সটভিউ প্রত্যাশা অনুসারে স্থানান্তরিত হয়েছে, তবে "এটি বলুন" পাঠ্যদর্শনটি আমাদের প্রত্যাশা অনুযায়ী এটি অনুসরণ করেনি। এর কারণ হল অনুবাদ ঘটে যে পোস্ট-বিন্যাস । যদিও ভিউ পোস্ট-লেআউটটি সরায়, তবুও এটি নতুন অবস্থানে ক্লিকযোগ্য করে তোলা যেতে পারে।

সুতরাং, আইএমও, সঙ্গে যেতে অনুবাদ X এবং translationY ঋণাত্মক মার্জিন জন্য ConstraintLayout যদি সতর্কীকরণ উপরে আপনার লেআউট প্রভাবিত করে না; অন্যথায়, স্পেস উইজেটটি নীচে বর্ণিত হিসাবে যান।


আসল উত্তর

যদিও এটি প্রদর্শিত হচ্ছে না যে নেতিবাচক মার্জিনগুলি সমর্থিত হবে ConstraintLayout, উপলব্ধ এবং সমর্থিত সরঞ্জামগুলি ব্যবহার করে প্রভাবটি সম্পাদনের একটি উপায় রয়েছে। এখানে একটি চিত্র যেখানে চিত্রের শিরোনামটি চিত্রের 22dpনীচ থেকে ওভারল্যাপ করা আছে - কার্যকরভাবে একটি -22dpমার্জিন:

এখানে চিত্র বর্ণনা লিখুন

Spaceআপনি যে অফসেটটি চান তার সমান নীচে মার্জিন সহ একটি উইজেট ব্যবহার করে এটি সম্পন্ন হয়েছিল । Spaceউইজেট তারপর তার নীচে নীচে সীমাবদ্ধ রয়েছে ImageView। এখন আপনাকে যা করতে হবে তা হল উইজেটের TextViewনীচে চিত্রের শিরোনাম সহ শীর্ষের সীমাবদ্ধ করা SpaceTextViewনীচে স্থান হবে Spaceপ্রদর্শন মার্জিন যে হয় উপেক্ষা।

নিম্নলিখিত এক্সএমএল যা এই প্রভাবটি সম্পাদন করে। আমি নোট করব যে আমি ব্যবহার করি Spaceকারণ এটি হালকা ওজনের এবং এই ধরণের ব্যবহারের উদ্দেশ্যে, তবে আমি অন্য ধরণের ব্যবহার করতে Viewএবং এটি অদৃশ্য করে তুলতে পারি। (আপনি সম্ভবত সমন্বয় করতে, যদিও করতে হবে।) এছাড়াও আপনি একটি সংজ্ঞায়িত করতে পারে Viewশূন্য মার্জিন এবং আঁটা মার্জিন যদি আপনি চান উচ্চতা সঙ্গে, এবং উপরের সীমাবদ্ধ TextViewআঁটা শীর্ষে View

তবুও আরেকটি উপায় হ'ল TextViewউপরের উপরের ImageViewঅংশটি উপরে / বোতলস / লেফটস / ডান সারিবদ্ধ করে মার্জিন / প্যাডিংগুলিতে উপযুক্ত সামঞ্জস্য করা। নীচে প্রদর্শিত পদ্ধতির সুবিধাটি হ'ল প্রচুর গণনা ছাড়াই একটি নেতিবাচক মার্জিন তৈরি করা যায়। এটুকু বলতে গেলে এই কাছে যাওয়ার বিভিন্ন উপায় রয়েছে are

আপডেট: এই কৌশলটির তাত্ক্ষণিক আলোচনা এবং ডেমোটির জন্য, Google বিকাশকারী মিডিয়াম ব্লগ পোস্টটি দেখুন

ConstraintLayoutএক্সএমএলের জন্য নেতিবাচক মার্জিন

<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অ্যাপটি ব্যাকগ্রাউন্ড থেকে ফিরে আসার পরে ত্রুটি করে। আমার মনে হয় 0 ডিপি, 0 ডিপি কিছুটা সমস্যা তৈরি করে। শুধু ব্যবহার সম্পর্কে কি Guideline
মায়া

এই উপায়ে পিতামাতার সাথে বাধা রয়েছে দেখার জন্য কাজ করতে পারে না।
R4j

আমার কেন স্পেস দরকার? আমি জায়গা ছাড়াই চেষ্টা করেছি এবং আমিও একই ফল পেয়েছি।
কুজডু

@ কুজডু এখানে বিন্দুটি হ'ল স্থানের নীচের চিত্রটি ভিউয়ের নীচে সীমাবদ্ধ করা হয়েছে, মার্জিনটি স্থানটি উপরে সরিয়ে নিয়েছে এবং তারপরে পাঠ্য দৃশ্যের শীর্ষটি স্থানটির নীচে সীমাবদ্ধ থাকবে যা এই "অর্ধেক ওভারলেলিং তৈরি করে "প্রভাব আমরা অর্জনের চেষ্টা করছি। আপনি যদি কোনও জায়গা ছাড়াই এটি পরিচালনা করতে সক্ষম হন তবে দয়া করে এখানে একটি উত্তর পোস্ট করুন যাতে আপনি আপনার দুটি মতামতগুলিতে ব্যবহার করেছেন এমন প্রতিবন্ধকতাগুলি আমরা দেখতে পারি।
লুকাস পি।

আপনি হাইজেনবার্গ ...
নাহরো

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
এ সম্পর্কে সচেতন থাকুন, যেহেতু দৃশ্যের আসল অবস্থানটি মূল অবস্থানে থাকে (অনুবাদ করার আগে), এটি কেবল দৃষ্টিকোণেই অনুবাদ করা হবে। এর মাধ্যমে, অনক্লিক ইভেন্টগুলি কেবল পুরানো অবস্থানের মধ্যে থেকেই ট্রিগার করা হবে।
গেমিক

@ গেমিকের বক্তব্য ভুল বলে মনে হচ্ছে, যেহেতু এটি কোনও মধ্যবর্তী অ্যানিমেশন নয় তবে সম্পত্তি অ্যানিমেশন। (দয়া করে আমি ভুল হলে আমাকে সংশোধন করুন)
হেনরি

খারাপ অনুশীলন এটি আরটিএল লেআউটগুলি সমর্থন করে না
সালাম এল-বান্না

27

নেতিবাচক মার্জিনগুলি আনুষ্ঠানিকভাবে রিলেটিভলআউটে কখনও সমর্থন করা যায় নি। নেতিবাচক মার্জিনগুলি কনস্ট্রেন্টলয়েটে সমর্থিত হবে না। [...]

- জুন 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 দুটি চিত্র বিবেচনা করি। চিত্র 2 নীচে-ডানদিকে অবস্থিত চিত্র 1 এর শীর্ষে স্থাপন করতে হবে।

ওভারল্যাপিং দর্শন উদাহরণ ভাবমূর্তি

ওভারল্যাপিং দর্শনগুলির জন্য আমরা স্পেস উইজেট ব্যবহার করতে পারি ।

চিত্র 1 এর চার পাশের সাথে যথাক্রমে স্পেস উইজেটের চার পাশ সীমাবদ্ধ করুন। এই উদাহরণস্বরূপ, স্পেস উইজেটের ডান পাশ এবং চিত্র 2 এর উপরের অংশটি স্পেস উইজেটের নীচের দিকের সাথে চিত্র 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 এর বাম এবং ডানদিকে সীমাবদ্ধ করতে পারি। একইভাবে, আমরা স্পেস উইজেটের সাথে চিত্র 2 এর সীমাবদ্ধতাগুলি পরিবর্তন করে যেকোন জায়গায় ইমেজ 2 স্থাপন করতে পারি।


উত্তরের জন্য ধন্যবাদ!
ব্যবহারকারী3193413

11

আমি এটি অনেক সহজ করার একটি উপায় খুঁজে পেয়েছি।

মূলত ইমেজভিউটি থাকুন, তারপরে টেক্সট ভিউতে চিত্রের শীর্ষ সীমাবদ্ধতার সাথে মেলে শীর্ষ সীমাবদ্ধতা যুক্ত করুন এবং প্রান্তের-মার্জিন ধরণের আচরণটি অর্জন করতে টেক্সটভিউয়ের মার্জিন শীর্ষটি যুক্ত করুন।


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>

যাতে ইমেজভিউ গাইডলাইনটির শুরুতে শেষ হবে। এবং প্রভাব 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
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
এই উত্তরের আরও অনেক তথ্য প্রয়োজন। লিনিয়ারলআউটে কীভাবে কোনও কিছু রাখলে ওভারল্যাপটি সম্পন্ন হতে পারে তা অস্পষ্ট নয়।
রবার্ট লিবারাতোর
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.