Android - 测量文字高度

时间:2016-04-08 22:56:27

标签: android listview

我从this question复制了代码并且它的工作几乎完美,问题是作者将列表项的高度设置为固定值,并且它在我的设备上无法正确显示。

代码将列表项的高度设置为150,我想“嘿,我只是测量文本的高度”,所以我打电话给

Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG | Paint.LINEAR_TEXT_FLAG);
Rect bounds = new Rect();
paint.getTextBounds("April 3, 2016", 0, 13, bounds);
Log.d("Fragment.toggle", "Text height is " + bounds.height());

对于略大于150固定值的文本,从getTextBounds()返回的文本高度为12.由于12不是“略大于”150,我显然做错了。

我生命中写过很多软件,但这是我开发Android开发的第一天,所以我可能做的事情显然很愚蠢。我怀疑这两个值(150和12)是不同的单位,但我一直在文档中探讨,无法弄明白。

如何以AbsListView.LayoutParams所期望的单位计算文本的高度?

1 个答案:

答案 0 :(得分:0)

我终于把这个问题提交了。

答案的第一部分是来自getTextBounds()的返回代码是以分数为单位的(如果文档说的话,那会不会很好?)。将该答案除以72得出我的文本高度(以英寸为单位),乘以DisplayMetrics.densityDpi得出文本高度(以像素为单位)。

Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG | Paint.LINEAR_TEXT_FLAG);
Rect bounds = new Rect(0, 0, 10000, 10000);
paint.getTextBounds("April 3, 2016", 0, 13, bounds);
DisplayMetrics dm = getActivity().getResources().getDisplayMetrics();
float textHeightInches = bounds.height() / 72.0f;
float textHeightPixels = textHeightInches * dm.densityDpi;

答案的第二部分是列表项在顶部和底部有填充,在计算总高度时必须包含填充。

LayoutInflater vi = (LayoutInflater) getActivity().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
LinearLayout listItemLayout = (LinearLayout)vi.inflate(R.layout.list_item, null);
int collapsedHeight = (int)(textHeightPixels + 0.5f) + listItemLayout.getPaddingTop() + listItemLayout.getPaddingBottom();

现在,当我创建ListItem对象时,我可以传入我计算的高度而不是固定数字。