0

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 であることもわかりました。

4

1 に答える 1