Android Layout:getLineBaseline、getLineDescent、getLineAscent、getLineBottom、getLineTop的含义
Android Layout: meaning of getLineBaseline, getLineDescent, getLineAscent, getLineBottom, getLineTop
以下 Layout
(including StaticLayout
, DynamicLayout
, and BoringLayout
) 方法的文档非常稀少。
getLineBaseline(int line)
getLineDescent(int line)
getLineAscent(int line)
getLineBottom(int line)
getLineTop(int line)
这些方法返回的数字到底是多少?它们是正常的字体规格值还是布局上的位置?
我做了一个测试项目来找出答案,所以我把我的答案贴在问答风格下面。
我之前描述过meaning of top, ascent, baseline, descent, bottom, and leading in Android's FontMetrics。
因为 Layout
方法 getLineBaseline
、getLineDescent
、getLineAscent
、getLineBottom
和 getLineTop
听起来与 FontMetrics
的名字,很容易混淆。然而,他们报告了两种不同类型的事情:
这些方法return它们在布局上的垂直位置,每一行都不同。
getLineBaseline
getLineBottom
getLineTop
但是,以下两种方法return对于特定行的值它们是在上的,无论在哪里行在布局中。因此,除非有影响大小的特殊跨度,否则它们对每一行都是相同的。
getLineAscent
getLineDescent
演示
我做了一个简单的项目来演示上面的信息。 EditText
中有六行文本。单击该按钮会记录每一行的信息。
结果
这是记录的结果:
line 0 baseline: 67
line 1 baseline: 140
line 2 baseline: 213
line 3 baseline: 286
line 4 baseline: 359
line 5 baseline: 432
line 0 descent: 15
line 1 descent: 15
line 2 descent: 15
line 3 descent: 15
line 4 descent: 15
line 5 descent: 18
line 0 ascent: -67
line 1 ascent: -58
line 2 ascent: -58
line 3 ascent: -58
line 4 ascent: -58
line 5 ascent: -58
line 0 top: 0
line 1 top: 82
line 2 top: 155
line 3 top: 228
line 4 top: 301
line 5 top: 374
line 0 bottom: 82
line 1 bottom: 155
line 2 bottom: 228
line 3 bottom: 301
line 4 bottom: 374
line 5 bottom: 450
FontMetrics top: -67
FontMetrics bottom: 18
FontMetrics ascent: -58
FontMetrics descent: 15
如您所见,顶部、底部和基线是基于直线累积的。每条线的上升和下降主要保持不变。除第一行外,所有行的 Ascent 都等于 FontMetrics.ascent
,第一行等于 FontMetrics.top
。对于除最后一行以外的所有行,descent 都等于 FontMetrics.descent
,它等于 FontMetrics.bottom
.
因此,线的顶部、底部、基线、上升和下降不应被视为等于相同名称的 FontMetrics
值。 在线上升是从基线到它上面的线底部的距离。下降是从基线到下一行顶部的距离。
在源代码中,每行只保存top
和descent
。其他值是根据它们计算的:
- 底部 = 下一行的顶部
- 基线=底部-下降
- 上升=顶部-(底部-下降)
项目代码:
public class MainActivity extends AppCompatActivity {
EditText editText;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
editText = (EditText) findViewById(R.id.editText);
}
public void buttonClick(View view) {
Layout layout = editText.getLayout();
for (int i = 0; i < layout.getLineCount(); i++) {
int baseline = layout.getLineBaseline(i);
Log.i("TAG", "line " + i + " baseline: " + baseline);
}
for (int i = 0; i < layout.getLineCount(); i++) {
int descent = layout.getLineDescent(i);
Log.i("TAG", "line " + i + " descent: " + descent);
}
for (int i = 0; i < layout.getLineCount(); i++) {
int ascent = layout.getLineAscent(i);
Log.i("TAG", "line " + i + " ascent: " + ascent);
}
for (int i = 0; i < layout.getLineCount(); i++) {
int top = layout.getLineTop(i);
Log.i("TAG", "line " + i + " top: " + top);
}
for (int i = 0; i < layout.getLineCount(); i++) {
int bottom = layout.getLineBottom(i);
Log.i("TAG", "line " + i + " bottom: " + bottom);
}
Paint.FontMetricsInt fm = editText.getLayout().getPaint().getFontMetricsInt();
Log.i("TAG", "fm top: " + fm.top);
Log.i("TAG", "fm bottom: " + fm.bottom);
Log.i("TAG", "fm ascent: " + fm.ascent);
Log.i("TAG", "fm descent: " + fm.descent);
}
}
另见
以下 Layout
(including StaticLayout
, DynamicLayout
, and BoringLayout
) 方法的文档非常稀少。
getLineBaseline(int line)
getLineDescent(int line)
getLineAscent(int line)
getLineBottom(int line)
getLineTop(int line)
这些方法返回的数字到底是多少?它们是正常的字体规格值还是布局上的位置?
我做了一个测试项目来找出答案,所以我把我的答案贴在问答风格下面。
我之前描述过meaning of top, ascent, baseline, descent, bottom, and leading in Android's FontMetrics。
因为 Layout
方法 getLineBaseline
、getLineDescent
、getLineAscent
、getLineBottom
和 getLineTop
听起来与 FontMetrics
的名字,很容易混淆。然而,他们报告了两种不同类型的事情:
这些方法return它们在布局上的垂直位置,每一行都不同。
getLineBaseline
getLineBottom
getLineTop
但是,以下两种方法return对于特定行的值它们是在上的,无论在哪里行在布局中。因此,除非有影响大小的特殊跨度,否则它们对每一行都是相同的。
getLineAscent
getLineDescent
演示
我做了一个简单的项目来演示上面的信息。 EditText
中有六行文本。单击该按钮会记录每一行的信息。
结果
这是记录的结果:
line 0 baseline: 67
line 1 baseline: 140
line 2 baseline: 213
line 3 baseline: 286
line 4 baseline: 359
line 5 baseline: 432
line 0 descent: 15
line 1 descent: 15
line 2 descent: 15
line 3 descent: 15
line 4 descent: 15
line 5 descent: 18
line 0 ascent: -67
line 1 ascent: -58
line 2 ascent: -58
line 3 ascent: -58
line 4 ascent: -58
line 5 ascent: -58
line 0 top: 0
line 1 top: 82
line 2 top: 155
line 3 top: 228
line 4 top: 301
line 5 top: 374
line 0 bottom: 82
line 1 bottom: 155
line 2 bottom: 228
line 3 bottom: 301
line 4 bottom: 374
line 5 bottom: 450
FontMetrics top: -67
FontMetrics bottom: 18
FontMetrics ascent: -58
FontMetrics descent: 15
如您所见,顶部、底部和基线是基于直线累积的。每条线的上升和下降主要保持不变。除第一行外,所有行的 Ascent 都等于 FontMetrics.ascent
,第一行等于 FontMetrics.top
。对于除最后一行以外的所有行,descent 都等于 FontMetrics.descent
,它等于 FontMetrics.bottom
.
因此,线的顶部、底部、基线、上升和下降不应被视为等于相同名称的 FontMetrics
值。 在线上升是从基线到它上面的线底部的距离。下降是从基线到下一行顶部的距离。
在源代码中,每行只保存top
和descent
。其他值是根据它们计算的:
- 底部 = 下一行的顶部
- 基线=底部-下降
- 上升=顶部-(底部-下降)
项目代码:
public class MainActivity extends AppCompatActivity {
EditText editText;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
editText = (EditText) findViewById(R.id.editText);
}
public void buttonClick(View view) {
Layout layout = editText.getLayout();
for (int i = 0; i < layout.getLineCount(); i++) {
int baseline = layout.getLineBaseline(i);
Log.i("TAG", "line " + i + " baseline: " + baseline);
}
for (int i = 0; i < layout.getLineCount(); i++) {
int descent = layout.getLineDescent(i);
Log.i("TAG", "line " + i + " descent: " + descent);
}
for (int i = 0; i < layout.getLineCount(); i++) {
int ascent = layout.getLineAscent(i);
Log.i("TAG", "line " + i + " ascent: " + ascent);
}
for (int i = 0; i < layout.getLineCount(); i++) {
int top = layout.getLineTop(i);
Log.i("TAG", "line " + i + " top: " + top);
}
for (int i = 0; i < layout.getLineCount(); i++) {
int bottom = layout.getLineBottom(i);
Log.i("TAG", "line " + i + " bottom: " + bottom);
}
Paint.FontMetricsInt fm = editText.getLayout().getPaint().getFontMetricsInt();
Log.i("TAG", "fm top: " + fm.top);
Log.i("TAG", "fm bottom: " + fm.bottom);
Log.i("TAG", "fm ascent: " + fm.ascent);
Log.i("TAG", "fm descent: " + fm.descent);
}
}