Гладкая очень медленная текстовая анимация в Android canvas, СУБПИКСЕЛЬНЫЙ текстовый флаг не работает

Я не могу добитьсягладкий очень медленная текстовая анимация на холсте, потому что Canvas.drawText не хочет рисовать "между пикселями". Например, учитывая 4 последовательных кадра, где я рисую текст со смещением Y 0, 0.5, 1, 1.5, холст фактически нарисует его при смещениях 0, 0, 1, 1, соответственно, что вызывает анимацию "рывками". Есть флаг под названием Paint.SUBPIXEL_TEXT_FLAG это должно поддерживать точность поплавка.

Я нашел связанный поток, в котором Romain Guy сказал, что этот флаг в настоящее время не поддерживается в Android: значение некоторых констант краски в Android.

мой вопрос: существует ли какой-либо обходной путь ?

Примечание: рисование текста в другом растровом изображении один раз, а затем нарисовать это растровое изображение с смещениями float вместо рисования текста, похоже, тоже не работает.

1 ответов


вы можете имитировать этот эффект, рисуя два текста бок о бок с Альфа-балансировкой (между 127 и 255) между двумя элементами.

предположим, что ваш текст движется снизу вверх, а текущее вертикальное положение-10.28. Вам просто нужно нарисовать один текст в позиции 10 с Альфой около 127, а другой текст в позиции 11 с Альфой около 255.

вот немного (ugly :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);
    }
}