7

「ピクセル間」を描画したくないため、Canvasでスムーズで非常に遅いテキストアニメーションを実現できません。Canvas.drawTextたとえば、Yオフセットが0、0.5、1、1.5のテキストを描画する4つの連続したフレームがある場合、キャンバスは実際にはそれぞれオフセット0、0、1、1でテキストを描画します。これにより、アニメーションは「」になります。ぎくしゃくした」。Paint.SUBPIXEL_TEXT_FLAG浮動小数点の精度を維持することになっているというフラグがあります。

Romain Guyがこのフラグは現在Androidではサポートされていないと言っている関連スレッドを見つけました:Androidのいくつかのペイント定数の意味

私の質問は:既存の回避策はありますか?

注:テキストを別のビットマップに一度描画してから、テキストを描画する代わりにフロートオフセットを使用してこのビットマップを描画しても機能しないようです。

4

1 に答える 1

3

この効果は、2つの要素間でアルファバランス(127〜255)を使用して2つのテキストを並べて描画することでシミュレートできます。

テキストが上から下に移動していて、現在の垂直位置が10.28であると仮定します。位置10にアルファが127に近いテキストを描画し、位置11にアルファが255に近いテキストをもう1つ描画する必要があります。

ここに少し(醜い: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);
    }
}
于 2012-09-14T09:28:26.517 に答える