我有一个自定义ScoreView,包含两行文字(名称和分数)。在该文本的背后,我正在绘制一个代表分数的条形图。
我有一个包含三个这样的ScoreView的片段。当我使用新名称或分数更新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
具有正确的大小和位置。它根本无法显示。
我还发现如果我重新安排三个ScoreViews,它总是第一个正确更新的ScoreView。
答案 0 :(得分:1)
我不确定,但是mFillRect = new Rect(getLeft(), getTop(), getLeft()
这意味着您设置了视图左侧和顶部的偏移量,但随后您使用此矩形在同一视图内绘制。我认为它只是在视野的画布区域之外,这就是为什么你看不到它。我可能错了。