Я не знал о 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
Вот что яв конечном итоге делать из этого кода.Ответ Готье привел меня к этому вопросу, поэтому я предпочел бы принять этот ответ с изменениями, чем отвечать на него сам.Я закончил тем, что вместо этого использовал метод addOnGlobalLayoutListener () ViewTreeObserver, вот так (это в 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 и не увидел никакой необычной активности.Надеюсь, это так!Спасибо!