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

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

问题描述:

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

这实际上可能是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并尝试获取那里的行数。同样,与视图树观察者一样,有时可以在实际测量视图之前调用这些视图,因此您可能需要检查以确保您在这些方法中获得的任何值都有意义。