Android画布中的平滑非常慢的文本动画,SUBPIXEL_TEXT_FLAG无法正常工作

时间:2012-09-14 08:25:01

标签: android canvas drawtext

我无法在Canvas中实现 smooth 非常慢的文本动画,因为Canvas.drawText不想在“像素之间”绘制。例如,给定4个连续帧,其中我绘制Y偏移为0,0.5,1,1.5的文本,画布实际上将分别在偏移0,0,1,1处绘制它,这导致动画“生涩”。有一个名为Paint.SUBPIXEL_TEXT_FLAG的标志,它应该保持浮动精度。

我找到了一个相关主题,其中Romain Guy表示Android目前不支持此标记:Meaning of some Paint constants in Android

我的问题是:是否有现成的解决方法?

注意:在另一个位图中绘制一次文本,然后使用浮动偏移绘制此位图而不是绘制文本似乎也不起作用。

1 个答案:

答案 0 :(得分:3)

您可以通过在两个元素之间并行绘制两个文本并进行Alpha平衡(介于127和255之间)来模拟此效果。

假设您的文本从上到下移动,当前垂直位置为10.28。你只需要在位置10处绘制一个文本,其中alpha值接近127,另一个文本位于第11位,alpha值接近255.

这是一个小(丑陋:D)的例子:

private void doDraw(Canvas canvas) {
    Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG);
    paint.setColor(Color.BLACK);
    paint.setTextSize(20);
    canvas.drawRect(0, 0, getWidth(), getHeight(), paint);

    mY += 0.05f;
    paint.setColor(Color.RED);

    if (Math.floor(mY) == mY) {
        canvas.drawText("test", mX, mY, paint);
    } else {
        float mY1 = (float) Math.floor(mY);
        float mY2 = mY1 + 1;
        float delta = mY - mY1;

        paint.setAlpha((int) ((1 - delta) * 127) + 127);
        canvas.drawText("test", mX, mY1, paint);

        paint.setAlpha((int) ((delta) * 127) + 127);
        canvas.drawText("test", mX, mY2, paint);
    }
}