知らなかったので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()
では2回呼び出されましたが、あなたの場合は無限ループが発生する可能性があると思います。
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を確認しましたが、異常なアクティビティは見られませんでした。うまくいけば、これはそれです!ありがとう!