gpt4 book ai didi

android - 我什么时候可以首先测量 View ?

转载 作者:IT老高 更新时间:2023-10-28 13:23:09 26 4
gpt4 key购买 nike

所以我在尝试设置 View 的背景可绘制对象时有点困惑。代码依赖于知道 View 的高度,所以我不能从 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);

最佳答案

我不知道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() 已被调用两次,我认为在您的情况下它可能会导致无限循环。

您可以尝试仅在 TextView 的高度发生变化时调用 setBackgroundDrawable() :

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 编辑

这就是我最终从这段代码中所做的事情。 Gautier的回答让我明白了这一点,所以我宁愿接受这个修改后的答案,也不愿自己回答。我最终改用了 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 并没有看到任何异常 Activity 。希望就是这样!谢谢!

关于android - 我什么时候可以首先测量 View ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4393612/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com