0

我有一个自定义的 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。

4

1 回答 1

1

我不确定,但这mFillRect = new Rect(getLeft(), getTop(), getLeft()意味着您设置了视图的左侧和顶部的偏移量,然后您使用此矩形在同一视图内绘制。我认为它只是在视野之外的画布区域,这就是你看不到它的原因。不过我可能是错的。

于 2013-05-24T00:13:10.873 回答