2017-10-05 50 views
0

我正在嘗試根據其Y值和另一個視圖Y值的差異來翻譯TextView。在翻譯TextView之前,我改變它的文本大小,有效地改變它的Y值。發生的問題是TextView的Y值在文本大小改變後沒有立即更新。更改文本大小後立即獲取TextView頂部/ Y

E.G.這兩個日誌語句產生相同的結果

Log.i(TAG, String.valueOf(productTotal.getY())); 
productTotal.setTextSize(TypedValue.COMPLEX_UNIT_PX, textSize); 
Log.i(TAG, String.valueOf(productTotal.getY())); 

但是,如果我要再次運行此代碼,我會收到一個更新的Y值。我的猜測是因爲下面的邏輯是在按下按鈕時調用的,所以TextViews的Y值可能會被緩存直到下一次幀更新?無論如何,getTop,getY,getHeight都會給我不正當的價值。在更改TextViews文本大小後,您有什麼建議需要立即獲取更新後的Y值?謝謝。

回答

0

如果您需要立即找到getY()的值,則必須預測視圖進行佈局處理時會發生的一些工作。這首先需要撥打電話到View#measure()如下:

TextView productTotal = (TextView) findViewById(R.id.textView1); 
int textSize = 100; 

Log.i(TAG, String.valueOf(productTotal.getY())); 
productTotal.setTextSize(TypedValue.COMPLEX_UNIT_PX, textSize); 
Log.i(TAG, String.valueOf(productTotal.getY())); 
ViewGroup parent = ((ViewGroup) productTotal.getParent()); 
int widthMeasureSpec = 
    View.MeasureSpec.makeMeasureSpec(parent.getWidth(), View.MeasureSpec.UNSPECIFIED); 
int heightMeasureSpec = 
    View.MeasureSpec.makeMeasureSpec(parent.getHeight(), View.MeasureSpec.UNSPECIFIED); 
productTotal.measure(widthMeasureSpec, heightMeasureSpec); 
Log.i(TAG, String.valueOf(productTotal.getY())); 
// No getMeasuredY(), so we have to back into the new value for "Y". 
Log.i(TAG, String.valueOf(productTotal.getBottom() - productTotal.getMeasuredHeight())); 

doc for measure()

[度量]被調用以找出視圖應該有多大。父級在寬度和高度參數中提供約束信息。

+0

我發現了一個簡單得多的解決方案,我只是預期了Y值後文本大小的變化。然而,我仍然有興趣瞭解爲什麼這是一個問題。 android框架緩存視圖的邊界值直到下一個佈局傳遞? – whompum