2 行のテキスト (名前とスコア) で構成されるカスタム ScoreView があります。そのテキストの後ろに、スコアを表すバーを描いています。
そのような 3 つの ScoreViews を含むフラグメントがあります。ScoreViews を新しい名前またはスコアで更新すると、すべて正常に動作します。ただし、それらの背後にある長方形を更新すると、最初の長方形のみが再描画されます。
最終結果は次のようになります。
3 つの ScoreView のすべてで、テキストの後ろに灰色のバーが表示されます。
塗りつぶしの色属性がこれを引き起こす可能性を防ぐために、ScoreView でバーの色を静的に設定しています。
ScoreView スニペット:
public class ScoreView extends View {
public void setFillPercent(float percent) {
mFillPercent = percent;
mFillRect = new Rect(getLeft(), getTop(), getLeft() + Math.round(mFillPercent*getWidth()), getBottom());
invalidate();
requestLayout();
}
@Override
protected void onSizeChanged (int w, int h, int oldw, int oldh) {
mFillRect = new Rect(getLeft(), getTop(), getLeft() + Math.round(mFillPercent*w), getBottom());
mTextXPos = getLeft() + 20; // TODO dp?
mNameTextYPos = h/2 - (int)mNameTextSize;
mScoreTextYPos = h/2 + (int)mScoreTextSize;
}
@Override
protected void onDraw(Canvas canvas) {
canvas.drawRect(mFillRect, mFillPaint);
canvas.drawText(mName, mTextXPos, mNameTextYPos, mNameTextPaint);
canvas.drawText(String.valueOf(mScore), mTextXPos, mScoreTextYPos, mScoreTextPaint);
}
}
私のフラグメントでは、次のように呼び出します。
oneScoreView.setFillPercent(.5f);
twoScoreView.setFillPercent(.5f);
threeScoreView.setFillPercent(.5f);
ブレークポイントを設定すると、それが呼び出され、正しいサイズと位置にonDraw()
なっていることがわかります。mFillRect
表示されないだけです。
また、3 つの ScoreView を並べ替えると、正しく更新されるのは常に最初の ScoreView であることもわかりました。