【发布时间】:2019-12-08 20:41:26
【问题描述】:
从开发者指南中说
虽然视图可以定义填充,但它不提供对边距的任何支持。但是,视图组提供了这样的支持。
但为什么我可以在ImageView、EditView 等中设置layout_margin 属性,它们的存在和工作就像填充一样,
我无法理解指南所说的内容,有人可以帮我理解吗?
【问题讨论】:
从开发者指南中说
虽然视图可以定义填充,但它不提供对边距的任何支持。但是,视图组提供了这样的支持。
但为什么我可以在ImageView、EditView 等中设置layout_margin 属性,它们的存在和工作就像填充一样,
我无法理解指南所说的内容,有人可以帮我理解吗?
【问题讨论】:
基本上这意味着边距是在 xml 中为子视图定义的,但由它们的父视图使用。
从技术上讲,填充是 View 类的字段。 View 本身在 View.draw() 方法中使用填充。见:
边距是 MarginLayoutParams 类的字段。 ViewGroup 使用边距来布局其子级。见:
http://developer.android.com/reference/android/view/ViewGroup.MarginLayoutParams.html
编辑:
边距被加载到 MarginLayoutParams,然后在布局阶段使用。
使用这些 xml 属性在 FrameLayout 中创建 MarginLayoutParams 的方法: http://grepcode.com/file/repository.grepcode.com/java/ext/com.google.android/android/5.0.2_r1/android/widget/FrameLayout.java#678
【讨论】:
视图类不包含边距。它包含填充,因为填充偏移了视图的内容。边距是为了从父视图组中偏移视图本身。因此,边距包含在 ViewGroup 类中。 但是请记住继承的原则。视图是 ViewGroup 类的子级。因此,它继承了 ViewGroup 的属性,包括边距。因此,当您在视图上应用边距时,它会响应,因为它已经通过继承具有边距属性。
【讨论】: