مقالات

constarnlayout ، demistified – چگونه واقعاً کار می کند و وقتی باید به آن برسید | توسط Akshay Nandwana | سپتامبر ، 2025


مخاطب: مهندسان اندرویدی که می خواهند در مورد طرح به عنوان طراحان سیستم فکر کنند. اگر استفاده کرده اید LinearLayout/ /RelativeLayout یا آهنگسازی Box/Row/Column و نمی دانم وقتی ConstrantLayout ابزار بهتری است – و چرا – این برای شما مناسب است.

tl ؛ دکتر

  • محدودیت به شما امکان می دهد رابط کاربری را به عنوان مجموعه ای از آن مدل کنید محدودیت ها بین لنگرها (طرفین ، خطوط پایه) ، نه جعبه های ورودی.
  • در داخل ، آن را ایجاد می کند خط معادلات خطی بیش از این لنگرها و آنها را با حل محدودیت سبک صندوقدار حل کنید ، سپس مرزهای محاسبه شده را در onLayoutحرف
  • از آن استفاده کنید نمای نمایباز کردن قفل موقعیت یابی انعطاف پذیر (زنجیرها ، دستورالعمل ها ، موانع ، نسبت ها ، تعصب) و متحرک با MotionLayout.
  • در تالیف کردن. ، constraintlayout-compose مدل آینه با ConstraintLayout. ، createRefs(). ، createGuideline*. ، create*Barrier. ، create*Chainوت Dimension API
  • با این کار بیش از حد از آن استفاده نکنید: پشته های ساده بهتر جریان می یابند Box/Row/Column (آهنگسازی) یا LinearLayout/ /FrameLayoutحرف
برای مشاهده تصویر در اندازه کامل ، Enter را فشار دهید یا کلیک کنید

ConstarnLayout چیست؟

constarnlayout یک است ViewGroup (و چیدمان ترکیب) که در آن هر کودک اعلام می کند رابطه– “Edge Edge 16DP از شروع والدین” ، “خط پایه ، با عنوان” ، “بین A و B با 30 ٪ تعصب متمرکز شده است.” این روابط (محدودیت ها) تعیین می کنند موقعیت وت اندازه؛ شما هنگام نگه داشتن یک رابط کاربر پیچیده و پاسخگو دریافت می کنید سلسله مراتب مسطححرف

📚 اسناد:

چرا گوگل آن را ساخت

1) پیچیدگی بدون لانه سازی

عمیقاً جاسازی شده LinearLayout/ /RelativeLayout فکر کردن ساختارها دشوار است و شکستن آن آسان است. constarnlayout می سازد روابط صریح و به صورت محلی: بدون ایجاد مزاحمت در بقیه ، یک محدودیت را ایجاد کنید.

2) بهره وری در مقیاس

هر لایه اضافی در درخت نمای ارزش شما را دارد اندازه گیری/طرح بندی و نامعتبر است درخت مسطح این هزینه ها را کاهش می دهد. والدین کمتری → کمتری خواب دارند → کمتر از جنجال تحت پیمایش/انیمیشن.

برای مشاهده تصویر در اندازه کامل ، Enter را فشار دهید یا کلیک کنید

خط اصلی

هر کودک در معرض دید لنگر: start. ، end. ، top. ، bottom. ، baselineبه علاوه لنگرهای مرکزی. شما لنگرها را به لنگرهای دیگر یا به والدینs اندازه توسط کنترل می شود رفتار ابعاد:

  • WRAP_CONTENT: در آغوش محتوا.
  • FIXED: DP دقیق.
  • MATCH_CONSTRAINT (S)0dp در XML): فضا را پر کنید ، که با محدودیت ها دلالت دارد. می تواند با وزن. ، نسبت. ، حداقل/حداکثرحرف

توابع قدرت

  • زنجیر: یک دنباله به صورت افقی/عمودی با سبک ها تراز کنید: spread. ، spread_inside. ، packedبا وزن مورد
  • راهنمایی: لنگرهای DP نامرئی یا موقعیت ٪.
  • موانع: لبه های پویا تعریف شده توسط دورترین کودک محور.
  • تساوی پایه: خطوط پایه متن در اندازه های مختلف قلم مرتب شده اند.
  • نسبت و تعصب: نسبت ابعاد مدرن و “تکیه” از یک طرف.

در زیر درب (چگونه در واقع در معرض نمایش قرار می گیرد)

  1. جمع آوری محدودیت ها در طول onMeasure()حرف
  2. ترجمه قوانین لنگر و ابعاد در خطی متغیرها (موقعیت ها) و نابرابری ها (حداقل/حداکثر/نسبت/وزن/تعصب).
  3. تصمیم گیری با Casor -inspired یک راه حل تدریجی که به اولویت ها احترام می گذارد (در برابر محدودیت های نرم).
  4. محدودیت ها برای هر کودک و حافظه نهان.
  5. درخواست کردن در onLayout()؛ بکسل ساده است.

این جدایی – محدودیت های اعلامیه → محدودیت های حل شده – به همین دلیل ویژگی هایی مانند زنجیرها/موانع/نسبت ها تمیز می شوند و چرا MotionLayout می تواند محدودیت های زمانی را احیا کند.

برای مشاهده تصویر در اندازه کامل ، Enter را فشار دهید یا کلیک کنید

نمونه های عملی XML

1) “سلول رسانه ای” جمع و جور با تصویر ، عنوان/زیرنویس و تأخیر CTA

برای مشاهده تصویر در اندازه کامل ، Enter را فشار دهید یا کلیک کنید

یادداشت ها:

  • با استفاده از تصویر 0dp قد + 1:1 نسبت برای مربع و عمودی از طریق محدودیت های فوقانی/پایین محور است.
  • Barrier باعث می شود که CTA سازگار شود title بسته بندی

2) یک طرح دو کلسیم با درصدی زنجیره ای و بسته بندی شده

برای مشاهده تصویر در اندازه کامل ، Enter را فشار دهید یا کلیک کنید

3) جریان جریان برای تراشه های پویا (constrantlayout 2.x)

برای مشاهده تصویر در اندازه کامل ، Enter را فشار دهید یا کلیک کنید

(تراشه های خود را به عنوان فرزندان عادی اضافه کنید ؛ جریان آنها را قرار می دهد.)

یک همکار را گردآوری کنید

اضافه کردن androidx.constraintlayout:constraintlayout-compose و از بدوی های آشنا استفاده کنید:

برای مشاهده تصویر در اندازه کامل ، Enter را فشار دهید یا کلیک کنید

  • زنجیرها: createHorizontalChain(a, b, chainStyle = ChainStyle.Packed)
  • دستورالعمل ها: createGuidelineFromStart(0.35f)
  • موانع: createEndBarrier(vararg refs)
  • MotionLayout (آهنگسازی): androidx.constraintlayout.compose.MotionLayout

کتاب بازی

  • ترجیح دادن مسطح محدودیتی در پشته های عمیق جاسازی شده در صورت نیاز تساوی یک متقاطع یا دو راه روابط (به عنوان مثال “مرکز بین A و B”).
  • استفاده کردن MATCH_CONSTRAINT (S)0dp) + نسبت/مرزها برای جلوگیری از کودکان سنگین بیش از حد.
  • اجتناب کردن WRAP_CONTENT برای ظروف با بسیاری از کودکان با اندازه متغیر ، اگر این امر باعث افزایش اندازه گیری مجدد شود. کلاه با min/max یا درون یک والدین محدود بپیچید.
  • محدودیت ها را حفظ کنید حداقل و مخالف – حل فرآیندها محدودیت های نرم ، اما شما هنوز هم هزینه ابهام را پرداخت می کنید.
  • حساب کردن بازرس طرح واد ساختمانهای پروفایل؛ ساعت اندازه/طرح مدت زمان تحت پیمایش/انیمیشن.

خواندن اضافی:

نکات و ابزارهای سلطنت خطا

  • در استودیوی اندرویدی: دسته برای محدود کردن ویرایشگر طرح بیش از یک اسباب بازی است – از آنها استفاده کنید تجسم کردن زنجیرها/موانع/دستورالعمل ها و صادرات XML تمیز.
  • هشدارهای توجه:
    “بدون محدودیت عمودی/افقی”: شما (0.0) یا قرار دادن مبهم دریافت خواهید کرد. حداقل یک حد به هر محور اضافه کنید.
    درگیری اندازه + محدودیت ها: wrap_content با ratio بدون 0dp همانطور که انتظار دارید رفتار نخواهید کرد.
  • سوئیچ های بهینه سازی: app:layout_optimizationLevel ریشه ممکن است میانبرها را حل کند. به طور پیش فرض ترک کنید مگر اینکه تشخیص قرار گیرد (اختصاص دهید none) یا بهینه سازی میکرو موارد خاص.

چه موقع استفاده از چه (جدول راه حل)

برای مشاهده تصویر در اندازه کامل ، Enter را فشار دهید یا کلیک کنید

کتاب مهاجرت: از طراحی ورودی گرفته تا محدودیت ها

  1. روابط ضمنی را تعیین کنید در طرح ورودی شما (“B 16 DP در سمت راست A” ، “عنوان با پایه CTA تراز شده است”).
  2. ریشه ای برای محدودیت ایجاد کنید وت لنگرهای خود را نام ببرید (S)@id/title. ، @id/cta).
  3. بندر نمای جایگزین لانه والدین – شروع/پایان/بالا/پایین پیوندها
  4. استفاده کردن راهنمایی برای ستون ها/ردیف ها قبل از نزدیک شدن به پدها/وزنه ها.
  5. مسافت ad-hoc را با آن جایگزین کنید زنجیر وت تعصب برای توزیع مقاوم تر.
  6. کوشش (تلفن های کوچک ، قرص های بزرگ ، چشم انداز) و تنظیم با استفاده از ٪ راهنمایی و حداقل/حداکثر.

مشکلات رایج (و تعمیرات)

  • استفاده کردن match_parent محدودیت داخلی
    → ترجیح دهید 0dp (S)MATCH_CONSTRAINT) با محدودیت های متضاد برای ترک اندازه قاطع.
  • فراموش کردن یک محور
    → هر نمای حداقل به یک محدودیت افقی و یک محدودیت عمودی نیاز دارد.
  • ساخت و ساز بیش از حد با DP دقیق در همه جا
    → منجر به چیدمان های شکننده می شود. استفاده کردن تعصب. ، نسبت. ، راهنماییوت وزنحرف
  • با فرض موانع ایستا است
    → آنها از دیدگاههای مرجع محاسبه می کنند. برای محتوای پویا عالی است ، اما در مورد چرخه ها مراقب باشید.
  • انیمیشن از طریق انیماتورهای دارایی
    → برای انیمیشن که توسط محدودیت ها مدیریت می شود ، حرکت بسیار ساده تر و سالم تر است.

MotionLayout: محدودیت هایی که حرکت می کنند

Animlayout (بخشی از همان کتابخانه) انیمیشن ها بین مجموعه محدودیت ها با انتقال اعلامی و فریم های کلیدی. به جای اینکه چند برابر شود ObjectAnimators ، شما تعیین می کنید حالت های شروع/پایان و موتور موقعیت ها ، اندازه ها و ویژگی های شخصی را درون یابی می کند. در آهنگسازی ، دسترسی به MotionLayout در constraintlayout-composeحرف

مرجع

اسناد رسمی

منبع و مشکلات

شیرجه و درس های عمیق

دروس اضافی و آغازگرها:

انتساب: در این مقاله مفاهیم اسناد توسعه دهنده اندرویدی ، وبلاگ توسعه دهندگان اندرویدی ، دروس جامعه و منابع منبع باز ، ذکر شده در بالا ، سنتز می شود. این اتصالات برای یک مطالعه عمیق تر به مواد اصلی اشاره می کنند.

رها کردن قطعات (کپی/ماکارونی آماده)

پوستر نسبت با یک تصویر کامل بسته شده توسط حداقل. قد

زنجیره افقی با وزن

دستورالعمل ها + زنجیره

مشورت

بازدید کنید تا محدود کنید رابطه مهمتر از لانهS مدل رابط کاربری به عنوان یک مجموعه کوچک از متغیر: تراز ، نسبت ها و مرزها. راه حل باعث می شود حسابداری برای شما حساب کند – بنابراین با توسعه طرح ها ، تغییر کپی و دستگاه ها از تلفن تا تاشو به تلویزیون ها ، طرح شما پایدار می ماند.

اگر می خواهید ، می توانم مثالهای بالا را در یک برنامه مثال کوچک (نمایش + آهنگسازی + MotionLayout) با شاخص ها و readme بسته بندی کنم که می توانید به GitHub وارد شوید.


Source link

نوشته های مشابه

دیدگاهتان را بنویسید

دکمه بازگشت به بالا