只有三个自定义视图中的第一个正确绘制

时间:2013-05-23 22:55:15

标签: android android-view android-custom-view

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

1 个答案:

答案 0 :(得分:1)

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