Android:在渲染之前测量视图的大小

时间:2010-07-30 23:45:20

标签: android view measure

我有一个TextView,显示更改和运行时间的文本。我想使用View.getLineCount()方法来查看TextView占用多少行并相应地执行不同的功能。问题是我需要确定TextView在相同方法中占用的行数,需要知道它占用了多少行。我试过在两次调用之间调用View.invalidate(),但似乎没有解决任何问题。如果可能的话,我想测量行数而不渲染视图,但如果我必须渲染它,我也会愿意这样做。如果这不够具体,请告诉我,我会尝试更具体。谢谢!

1 个答案:

答案 0 :(得分:1)

这实际上可能是Android中一个非常复杂的问题。如果您在设置文本时需要知道(即在渲染视图或接近渲染视图之前),您只能使用StaticLayout。如果您可以等到渲染时间附近,则可以使用viewTreeObserver:

yourTextView.getViewTreeObserver.addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
    @Override
    public void onGlobalLayout(){
        yourTextView.getLineCount();
    }
}

onGlobalLayout可以被多次调用,有时候(无论出于何种原因)我发现视图实际上还没有布局,所以你应该做一些日志记录,看看你是否能找到一种方法来确保无论结果如何你实际上是有道理的(即行数> 0)。

StaticLayouts是一个更复杂的替代方案,应该能够为您提供视图大小和行数。他们可能需要一些调整才能正常工作,并确保使用您尝试测量的视图中的颜料:

yourTextView.setText(newText);
//the last boolean should be true if you're using padding on your view
StaticLayout measure = new StaticLayout(yourTextView.getText(), yourTextView.getPaint(), 
    maxAvailableWidthForYourTextView, Layout.Alignment.ALIGN_NORMAL, 1.0f, 1.0f, false)

int numberOfLines = measure.getLineCount();

如果您愿意(或已经拥有)子类TextView,您可以覆盖onSizeChanged或onMeasure并尝试获取那里的行数。同样,与视图树观察者一样,有时可以在实际测量视图之前调用它们,因此您可能必须检查以确保在这些方法中获得的任何值都有意义。