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

Joa*_*oan 7 android canvas drawtext

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

我发现了一个相关的线程,其中Romain Guy说Android中目前不支持这个标志:Android 中一些Paint常量的含义.

我的问题是:有任何现有的解决方法吗?

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

Day*_*ayS 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);
    }
}
Run Code Online (Sandbox Code Playgroud)