Гладкая очень медленная текстовая анимация в 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);
}
}