第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問題,去搜搜看,總會(huì)有你想問的

我什么時(shí)候可以先測量視圖?

我什么時(shí)候可以先測量視圖?

郎朗坤 2019-08-12 14:38:09
我什么時(shí)候可以先測量視圖?所以我在嘗試設(shè)置視圖的背景可繪制時(shí)會(huì)有點(diǎn)混亂。該代碼依賴于知道視線的高度,所以我不能把它onCreate()或onResume(),因?yàn)間etHeight()返回0 onResume()似乎是最接近我可以得到雖然。我應(yīng)該在哪里放置如下所示的代碼,以便在顯示給用戶時(shí)背景發(fā)生變化?    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貢獻(xiàn)1765條經(jīng)驗(yàn) 獲得超5個(gè)贊

我不知道ViewTreeObserver.addOnPreDrawListener(),我在測試項(xiàng)目中嘗試過。

使用您的代碼,它看起來像這樣:

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;
   }});}

在我的測試項(xiàng)目onPreDraw()中被調(diào)用了兩次,我認(rèn)為在你的情況下它可能會(huì)導(dǎo)致無限循環(huán)。

您可以嘗試setBackgroundDrawable()僅在TextView更改高度時(shí)調(diào)用:

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;
   }});}

但對于你想要實(shí)現(xiàn)的目標(biāo)而言,這聽起來有點(diǎn)復(fù)雜,而且對性能并不是很好。

由kcoppock編輯

這是我最終通過此代碼完成的工作。戈蒂埃的回答讓我達(dá)到了這一點(diǎn),所以我寧愿接受這個(gè)答案而不是自己回答。我最終使用了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并沒有看到任何異?;顒?dòng)。希望就是這樣!謝謝!


查看完整回答
反對 回復(fù) 2019-08-12
?
HUWWW

TA貢獻(xiàn)1874條經(jīng)驗(yàn) 獲得超12個(gè)贊

通過使用全局偵聽器,您可能會(huì)遇到無限循環(huán)。

我通過電話來解決這個(gè)問題

whateverlayout.getViewTreeObserver().removeGlobalOnLayoutListener(this);

在偵聽器中的onGlobalLayout方法內(nèi)部。


查看完整回答
反對 回復(fù) 2019-08-12
  • 3 回答
  • 0 關(guān)注
  • 476 瀏覽

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號