亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

我什么時候可以先測量視圖?

我什么時候可以先測量視圖?

郎朗坤 2019-08-12 14:38:09
我什么時候可以先測量視圖?所以我在嘗試設置視圖的背景可繪制時會有點混亂。該代碼依賴于知道視線的高度,所以我不能把它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并沒有看到任何異?;顒?。希望就是這樣!謝謝!


查看完整回答
反對 回復 2019-08-12
?
HUWWW

TA貢獻1874條經驗 獲得超12個贊

通過使用全局偵聽器,您可能會遇到無限循環。

我通過電話來解決這個問題

whateverlayout.getViewTreeObserver().removeGlobalOnLayoutListener(this);

在偵聽器中的onGlobalLayout方法內部。


查看完整回答
反對 回復 2019-08-12
  • 3 回答
  • 0 關注
  • 478 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號