我有一个自定义的 ScoreView,它由两行文本(一个名称和一个分数)组成。在该文本后面,我正在绘制一个代表分数的条形图。
我有一个包含三个这样的 ScoreViews 的片段。当我用新名称或分数更新 ScoreViews 时,一切正常。但是,如果我更新它们后面的矩形,则只重绘第一个矩形。
最终结果是这样的:
所有三个 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
具有正确的大小和位置。它根本不会显示。
我还发现,如果我重新排列三个 ScoreView,则始终是第一个正确更新的 ScoreView。