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 个屏幕截图。第一个来自 JB,第二个来自 ICS。

截屏

截屏

非常感谢您的宝贵时间!

4

1 回答 1

9

在 Android 4.1 之前,硬件加速不支持 drawTextOnPath()。要解决此问题,只需在 Android < 4.1 上运行时在 View 上设置软件层类型。只需调用 View.setLayerType(View.LAYER_TYPE_SOFTWARE, null)。这将强制软件渲染并解决您的问题。

于 2012-12-10T02:22:02.843 回答