Ответ 1
Почему это должно быть только частично видимым?
Я добавил 130dp поля в каждом направлении выравнивания родительских элементов. Что означает, что представление должно быть только частично видимым в макете
Коробка становится меньше, потому что предпочтение отдается сохранению ее внутри родительского макета любой ценой, но при этом применяется маржа. Поскольку размер представления меньшего размера 50dp, вы добавили запас 130dp
, общая ширина, которая ему нужна, равна 180dp
, но только родительское представление имеет ширину 150dp
. Это 130dp + 50dp > 150dp
- дочерний элемент плюс поле не может помещаться внутри родителя.
Это "глупый вход", и интерпретатор XML делает все возможное, чтобы что-то сделать. Решение, которое оно делает в итоге, состоит в том, что оно может изменить ширину дочернего окна и по-прежнему соблюдать ограничение по границам. Или математически
130dp + 20dp == 150dp
В основном, он сокращает ширину внутреннего блока вниз от назначенного 50dp
до 20dp
, чтобы он мог поместиться внутри родителя с его добавленным запасом. И если вы посмотрите на размер квадрата 20dp
, он будет выглядеть правильно. Это на 60% меньше.
Это умное поведение интерпретатора, потому что, когда размеры экрана меняются, и он сталкивается с такими проблемами, он всегда должен сохранять ограничение по границам, противоположное ограничению ширины.
В итоге интерпретатор делает все возможное, чтобы поместиться в поле, и его маржа внутри его родителя, чтобы сделать это, делая блок меньше. Он выбирает сохранение заданного поля по заданной ширине - возможно, из-за самого верхнего родительского макета.
Когда вы говорите, что "это должно быть частично видимым", я полагаю, вы считаете, что ребенок будет отображать половину внутри родительских границ и половину вне границ родителя, подобно разработке форм в Windows. Это не так, потому что он всегда будет стараться держать детей в пределах родителей в большинстве макетов.
Выбранные варианты выбора зависят от самого верхнего родительского макета, некоторые макеты могут предпочесть сохранить ширину дочернего окна, а не поля, или даже сделать поле вне границ родителя.
Во втором случае:
поэтому я дал им 151dp поля в выровненных направлениях.
Вы переходите от точки, в которой интерпретатор может сжимать изображение. Он не может сжать изображение до отрицательного 1. Это
50dp + 151dp > 150dp
Он не может удовлетворить это ограничение по границам, которое вы ему дали, поэтому поведение довольно непредсказуемо. Полагаю, я бы сказал, что он знает, что не может хранить оба изображения вместе с полями внутри родителя. Поэтому он просто отображает один внутри и снаружи.
Еще раз, это глупый ввод, и интерпретатор делает все возможное, чтобы сделать то, что вы хотите.
Может ли кто-нибудь объяснить разницу в поведении и противоположный отрицательный эффект маржи?
Отрицательный запас будет делать разные вещи в зависимости от типа макета в родительском объекте и выравнивается. В макете кадра он будет относиться по-разному к относительной компоновке. Обычно, если вы смотрите на негативные макеты, вы выбрали неправильные родительские контейнеры, и вы пытаетесь взломать его, чтобы заставить его выглядеть правильно.
Я не знаю, что вы пытаетесь сделать точно, но, может быть, вам просто нужно немного подправить свой мыслительный процесс и подумать о плохом толковании, пытаясь понять XML, который вы ему даете.
Вы не были бы первым человеком, который был бы совершенно смущен макетами Android в Android. Вложенные макеты внутри макетов всегда сбивают с толку, и поведение меняется в зависимости от ряда вещей, таких как поля, выравнивания, ширины и т.д. Большинство людей, которых я знаю, просто обманывают его, пока оно не будет правильным, и попробуйте разные типы макета контейнера, чтобы получить правильный дизайн,
Короче говоря, избегайте играть с полями (например, flash или winforms) и играйте без макетов, вместо этого, чтобы получить то, что вам нужно.
надеюсь, что это поможет, извините за tl; dr.