1

私はAndroidをさらに学ぶために小さなゲームに取り組んでいますが、デジタル数字をグラフィカルな数字に置き換えることについて1つの質問があります。Canvas.drawTextを使用するのにうんざりしています...

数字がpng画像に印刷された場合、どのフレームを後で書き込むかを理解する関数を作成するにはどうすればよいですか?

さて、私が1240を獲得したとしましょう。これらの数字を、Canvasのグラフィック数字に置き換えられるようにしたいと思います。

質問を明確にしたいと思います、乾杯!

4

1 に答える 1

1

それほど難しいことではありません。いくつかのドローアブルを正しい場所に配置するだけです。ただし、堅牢なウィジェットを作成する場合は、さらに検討と計算が必要です。

public class MTextView extends View {
    public MTextView(Context context) {
        this(context, null);
    }

    public MTextView(Context context, AttributeSet attrs) {
        super(context, attrs);
        initDrawables();
    }

    private Drawable[] mDigitDrawables = new Drawable[10];
    private String mText = "123";

    private void initDrawables() {
        Resources res = getResources();
        mDigitDrawables[0] = res.getDrawable(R.drawable.digit_0);
        mDigitDrawables[1] = res.getDrawable(R.drawable.digit_1);
        mDigitDrawables[2] = res.getDrawable(R.drawable.digit_2);
        mDigitDrawables[3] = res.getDrawable(R.drawable.digit_3);
        mDigitDrawables[4] = res.getDrawable(R.drawable.digit_4);
        mDigitDrawables[5] = res.getDrawable(R.drawable.digit_5);
        mDigitDrawables[6] = res.getDrawable(R.drawable.digit_6);
        mDigitDrawables[7] = res.getDrawable(R.drawable.digit_7);
        mDigitDrawables[8] = res.getDrawable(R.drawable.digit_8);
        mDigitDrawables[9] = res.getDrawable(R.drawable.digit_9);

        for (int i = 0; i < 10; i++) {
            boundToLeftTop(mDigitDrawables[i]);
        }
    }

    private void boundToLeftTop(Drawable d) {
        d.setBounds(0, 0, d.getIntrinsicWidth(), d.getIntrinsicHeight());
    }

    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        int dw = mDigitDrawables[0].getIntrinsicWidth();
        int dh = mDigitDrawables[0].getIntrinsicHeight();
        int width = dw * mText.length() + getPaddingLeft()
                + getPaddingRight();
        int height = dh + getPaddingTop() + getPaddingBottom();
        setMeasuredDimension(resolveSize(width, widthMeasureSpec),
                resolveSize(height, heightMeasureSpec));
    }

    @Override
    protected void onDraw(Canvas canvas) {
        canvas.save();
        canvas.translate(getPaddingLeft(), getPaddingTop());
        for (int i = 0; i < mText.length(); i++) {
            int number = Integer.valueOf(mText.charAt(i) - '0');
            Drawable d = mDigitDrawables[number];
            d.draw(canvas);
            canvas.translate(d.getBounds().width(), 0);
        }
        canvas.restore();
    }
}
于 2012-11-28T16:54:13.453 に答える