ConstraintSet.connect() margin参数是px还是dp?
Is ConstraintSet.connect() margin parameter in px or dp?
val margin = 8
ConstraintSet().apply {
connect(anId, ConstraintSet.START, anotherId, ConstraintSet.START, margin)
}
margin
应用为像素还是密度相关像素?
散布在网络上的各种文章和伪造的知识似乎都不同意其中的一个或另一个。我正在寻找官方文档或来源证据。
边距、填充、约束...API 都以像素为单位。如果您有 DP,则必须先将其转换为像素。
必须是像素。使用下面的函数将 dp
转换为 px
.
public int dpToPx(int dp, Context context) {
float density = context.getResources()
.getDisplayMetrics()
.density;
return Math.round((float) dp * density);
}
一般来说,Java/Kotlin 与 px
一起工作。我找不到任何官方文档(或 ConstraintSet
或 Constraint
的源代码中的任何内容)直接说明这一点。
如果您查看 the source code 以获得 ViewGroup.MarginLayoutParams
,但是,您会发现此代码:
public MarginLayoutParams(Context c, AttributeSet attrs) {
...
int margin = a.getDimensionPixelSize(
com.android.internal.R.styleable.ViewGroup_MarginLayout_layout_margin, -1);
if (margin >= 0) {
leftMargin = margin;
topMargin = margin;
rightMargin= margin;
bottomMargin = margin;
}
...
}
应该很清楚(从对getDimensionPixelSize()
的调用)这里margin
的单位是px
。我认为说 MarginLayoutParams 是边距的 "original" 真实来源是合理的,我通常希望模仿这种行为的东西(如 ConstraintSet
)遵循相同的模式。
请注意 ConstraintLayout.LayoutParams
是 ViewGroup.MarginLayoutParams
的子类。
margin
参数应以像素为单位提供。
我最终追踪 ConstraintSet.applyTo(ConstraintLayout)
到 ConstraintSet.applyToInternal(ConstraintLayout)
并发现在这里,ConstraintLayout
的每个 child 都复制并传递了 LayoutParams
到 ConstraintSet.Constraint.applyTo(LayoutParams)
。然后将 ConstraintSet.Constraint
中的所有参数(未经修改)复制到 LayoutParams
中,然后将修改后的 LayoutParams
分配回 child。我认为这是提供的保证金参数应遵循 LayoutParams
规则的具体证据。
在ConstraintSet.java
this.applyToInternal(constraintLayout);
constraintLayout.setConstraintSet((ConstraintSet)null); }
在applyToInternal(ConstraintLayout)
声明
int count = constraintLayout.getChildCount();
//...
LayoutParams param;
for(int i = 0; i < count; ++i) {
View view = constraintLayout.getChildAt(i);
//...
param = (LayoutParams)view.getLayoutParams();
constraint.applyTo(param);
view.setLayoutParams(param);
//...
}
//...
在applyTo(LayoutParams)
声明
//...
param.leftMargin = this.leftMargin;
param.rightMargin = this.rightMargin;
param.topMargin = this.topMargin;
param.bottomMargin = this.bottomMargin;
//...
val margin = 8
ConstraintSet().apply {
connect(anId, ConstraintSet.START, anotherId, ConstraintSet.START, margin)
}
margin
应用为像素还是密度相关像素?
散布在网络上的各种文章和伪造的知识似乎都不同意其中的一个或另一个。我正在寻找官方文档或来源证据。
边距、填充、约束...API 都以像素为单位。如果您有 DP,则必须先将其转换为像素。
必须是像素。使用下面的函数将 dp
转换为 px
.
public int dpToPx(int dp, Context context) {
float density = context.getResources()
.getDisplayMetrics()
.density;
return Math.round((float) dp * density);
}
一般来说,Java/Kotlin 与 px
一起工作。我找不到任何官方文档(或 ConstraintSet
或 Constraint
的源代码中的任何内容)直接说明这一点。
如果您查看 the source code 以获得 ViewGroup.MarginLayoutParams
,但是,您会发现此代码:
public MarginLayoutParams(Context c, AttributeSet attrs) { ... int margin = a.getDimensionPixelSize( com.android.internal.R.styleable.ViewGroup_MarginLayout_layout_margin, -1); if (margin >= 0) { leftMargin = margin; topMargin = margin; rightMargin= margin; bottomMargin = margin; } ... }
应该很清楚(从对getDimensionPixelSize()
的调用)这里margin
的单位是px
。我认为说 MarginLayoutParams 是边距的 "original" 真实来源是合理的,我通常希望模仿这种行为的东西(如 ConstraintSet
)遵循相同的模式。
请注意 ConstraintLayout.LayoutParams
是 ViewGroup.MarginLayoutParams
的子类。
margin
参数应以像素为单位提供。
我最终追踪 ConstraintSet.applyTo(ConstraintLayout)
到 ConstraintSet.applyToInternal(ConstraintLayout)
并发现在这里,ConstraintLayout
的每个 child 都复制并传递了 LayoutParams
到 ConstraintSet.Constraint.applyTo(LayoutParams)
。然后将 ConstraintSet.Constraint
中的所有参数(未经修改)复制到 LayoutParams
中,然后将修改后的 LayoutParams
分配回 child。我认为这是提供的保证金参数应遵循 LayoutParams
规则的具体证据。
在ConstraintSet.java
this.applyToInternal(constraintLayout); constraintLayout.setConstraintSet((ConstraintSet)null); }
在applyToInternal(ConstraintLayout)
声明
int count = constraintLayout.getChildCount(); //... LayoutParams param; for(int i = 0; i < count; ++i) { View view = constraintLayout.getChildAt(i); //... param = (LayoutParams)view.getLayoutParams(); constraint.applyTo(param); view.setLayoutParams(param); //... } //...
在applyTo(LayoutParams)
声明
//... param.leftMargin = this.leftMargin; param.rightMargin = this.rightMargin; param.topMargin = this.topMargin; param.bottomMargin = this.bottomMargin; //...