1

私はゲームの作業を開始しました。ゲームが終了すると、ゲームの統計情報が記載されたボードが表示されます。勝者の名前は、アーチのボードの上に描かれています(TextOnPathクラスを使用します。ここにコードを貼り付けます)。Android 4.1.2ではテキストが正しく表示されますが、Android 4.0.3以下では同じことが起こりません(これを示すために画像を添付しました)。

私の質問は:私のプログラムの何が問題になっていますか?私のmin-SDKは8であり、JBで導入された新しいAPIを使用していません。解決策を見つけるのを手伝ってください。

これは私のクラスです(テキストを表示するために必要なメソッドはありません):

public class TextOnPath extends View {
    private String winner = "Computer";
    private Path mArc;
    int viewHeight, viewWidth;
    private Paint mPaintText;
    public TextOnPath(Context context) {
        super(context);
    }
    public TextOnPath(Context context, AttributeSet attrs) {
        super(context, attrs);
    }
    @Override
    protected void onDraw(Canvas canvas) {
        int offset = 0;
        if (offset < 16)
            offset = (18 - winner.length()) * 11;
        canvas.drawTextOnPath(winner, mArc, offset, 40, mPaintText);

        invalidate();
    }
    @Override
    protected void onSizeChanged(int xNew, int yNew, int xOld, int yOld) {
        super.onSizeChanged(xNew, yNew, xOld, yOld);
        viewWidth = xNew;
        viewHeight = yNew;
        Typeface chalk = Typeface.createFromAsset(getContext().getAssets(),
                "fonts/Chalkduster.ttf");
        // TODO Auto-generated constructor stub
        mArc = new Path();
        int pad = 20;
        RectF oval = new RectF(pad, 0, viewWidth - pad, viewHeight);

        mArc.addArc(oval, -180, 180);
        mPaintText = new Paint(Paint.ANTI_ALIAS_FLAG);
        mPaintText.setStyle(Paint.Style.FILL_AND_STROKE);
        mPaintText.setColor(Color.WHITE);
        int textsize = R.dimen.chalk_text_size;
        System.err.println(textsize);
        mPaintText.setTextSize(30f);
        mPaintText.setTypeface(chalk);

        this.setBackgroundResource(R.color.green);

    }

ここに2つのスクリーンショットを投稿しました。1つ目はJBからのもので、2つ目はICSからのものです。

スクリーンショット

スクリーンショット

どうもありがとうございました!

4

1 に答える 1

9

drawTextOnPath()は、Android4.1までハードウェアアクセラレーションでサポートされていませんでした。この問題を回避するには、Android <4.1で実行しているときに、ビューにソフトウェアレイヤータイプを設定するだけです。View.setLayerType(View.LAYER_TYPE_SOFTWARE、null)を呼び出すだけです。これにより、ソフトウェアレンダリングが強制され、問題が修正されます。

于 2012-12-10T02:22:02.843 に答える