我什么時候可以先測量視圖?所以我在嘗試設置視圖的背景可繪制時會有點混亂。該代碼依賴于知道視線的高度,所以我不能把它onCreate()或onResume(),因為getHeight()返回0 onResume()似乎是最接近我可以得到雖然。我應該在哪里放置如下所示的代碼,以便在顯示給用戶時背景發生變化? TextView tv = (TextView)findViewById(R.id.image_test);
LayerDrawable ld = (LayerDrawable)tv.getBackground();
int height = tv.getHeight(); //when to call this so as not to get 0?
int topInset = height / 2;
ld.setLayerInset(1, 0, topInset, 0, 0);
tv.setBackgroundDrawable(ld);
3 回答

POPMUISE
TA貢獻1765條經驗 獲得超5個贊
我不知道ViewTreeObserver.addOnPreDrawListener()
,我在測試項目中嘗試過。
使用您的代碼,它看起來像這樣:
public void onCreate() {setContentView(R.layout.main);final TextView tv = (TextView)findViewById(R.id.image_test);final LayerDrawable ld = (LayerDrawable)tv.getBackground();final ViewTreeObserver obs = tv.getViewTreeObserver();obs.addOnPreDrawListener(new ViewTreeObserver.OnPreDrawListener() { @Override public boolean onPreDraw () { Log.d(TAG, "onPreDraw tv height is " + tv.getHeight()); // bad for performance, remove on production int height = tv.getHeight(); int topInset = height / 2; ld.setLayerInset(1, 0, topInset, 0, 0); tv.setBackgroundDrawable(ld); return true; }});}
在我的測試項目onPreDraw()
中被調用了兩次,我認為在你的情況下它可能會導致無限循環。
您可以嘗試setBackgroundDrawable()
僅在TextView
更改高度時調用:
private int mLastTvHeight = 0;public void onCreate() {setContentView(R.layout.main);final TextView tv = (TextView)findViewById(R.id.image_test);final LayerDrawable ld = (LayerDrawable)tv.getBackground();final ViewTreeObserver obs = mTv.getViewTreeObserver();obs.addOnPreDrawListener(new ViewTreeObserver.OnPreDrawListener() { @Override public boolean onPreDraw () { Log.d(TAG, "onPreDraw tv height is " + tv.getHeight()); // bad for performance, remove on production int height = tv.getHeight(); if (height != mLastTvHeight) { mLastTvHeight = height; int topInset = height / 2; ld.setLayerInset(1, 0, topInset, 0, 0); tv.setBackgroundDrawable(ld); } return true; }});}
但對于你想要實現的目標而言,這聽起來有點復雜,而且對性能并不是很好。
由kcoppock編輯
這是我最終通過此代碼完成的工作。戈蒂埃的回答讓我達到了這一點,所以我寧愿接受這個答案而不是自己回答。我最終使用了ViewTreeObserver的addOnGlobalLayoutListener()方法,就像這樣(這是在onCreate()中):
final TextView tv = (TextView)findViewById(R.id.image_test);ViewTreeObserver vto = tv.getViewTreeObserver();vto.addOnGlobalLayoutListener(new OnGlobalLayoutListener() { @Override public void onGlobalLayout() { LayerDrawable ld = (LayerDrawable)tv.getBackground(); ld.setLayerInset(1, 0, tv.getHeight() / 2, 0, 0); }});
似乎工作得很完美; 我檢查了LogCat并沒有看到任何異?;顒?。希望就是這樣!謝謝!

HUWWW
TA貢獻1874條經驗 獲得超12個贊
通過使用全局偵聽器,您可能會遇到無限循環。
我通過電話來解決這個問題
whateverlayout.getViewTreeObserver().removeGlobalOnLayoutListener(this);
在偵聽器中的onGlobalLayout方法內部。
- 3 回答
- 0 關注
- 478 瀏覽
添加回答
舉報
0/150
提交
取消