【问题标题】:Android view support margin?Android视图支持边距?
【发布时间】:2019-12-08 20:41:26
【问题描述】:

从开发者指南中说

虽然视图可以定义填充,但它不提供对边距的任何支持。但是,视图组提供了这样的支持。

但为什么我可以在ImageViewEditView 等中设置layout_margin 属性,它们的存在和工作就像填充一样,

我无法理解指南所说的内容,有人可以帮我理解吗?

【问题讨论】:

    标签: android view margin


    【解决方案1】:

    基本上这意味着边距是在 xml 中为子视图定义的,但由它们的父视图使用。

    从技术上讲,填充是 View 类的字段。 View 本身在 View.draw() 方法中使用填充。见:

    http://grepcode.com/file/repository.grepcode.com/java/ext/com.google.android/android/5.0.2_r1/android/view/View.java#15156

    边距是 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

    加载边距:http://grepcode.com/file/repository.grepcode.com/java/ext/com.google.android/android/5.0.2_r1/android/view/ViewGroup.java#6619

    布局:http://grepcode.com/file/repository.grepcode.com/java/ext/com.google.android/android/5.0.2_r1/android/widget/LinearLayout.java#1539

    【讨论】:

    • 从第一个链接我看到,当视图绘制时,只有填充有意义,但我认为这是我们可以看到的内容,我不明白边距是如何工作的,等等重要的是边距的存在,我在指南中找不到边距属性,但它们可以应用于视图,我对此感到困惑
    • 所以视图没有边距是正确的,虽然edittext扩展了视图但它从其布局中获取边距参数,并且在绘制自身时不使用边距,但是在布局时,容器使用边距来决定如何定位子视图,对吧?
    【解决方案2】:

    视图类不包含边距。它包含填充,因为填充偏移了视图的内容。边距是为了从父视图组中偏移视图本身。因此,边距包含在 ViewGroup 类中。 但是请记住继承的原则。视图是 ViewGroup 类的子级。因此,它继承了 ViewGroup 的属性,包括边距。因此,当您在视图上应用边距时,它会响应,因为它已经通过继承具有边距属性。

    【讨论】:

      猜你喜欢
      • 2014-03-16
      • 2013-12-19
      • 1970-01-01
      • 1970-01-01
      • 2018-10-26
      • 2015-02-24
      • 2016-07-31
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多