1

ループ内のclipPathのサイズを増やしています。また、ループの内側には別のループがあり、これを使用してアルファを下げて描画するために使用するクリップパスをさらにいくつか作成して、トランジション効果を取得します。ただし、clipPathのサイズが大きくなると、遷移が遅くなり、遅れます。

こんな感じです

int size = 5;
Paint p1 = new Paint();
Path path = new Path();
for (int i = 0; i < 20; i++) {
    path.addCircle(centerX, centerY, size, Path.Direction.CCW);
    canvas.clipPath(path);
    canvas.drawBitmap(bmp2, 0, 0, null);
    path.reset();
    int incr = size;
    while (p1.getAlpha() != 0) {
        incr -= 1;
        p1.setAlpha(p1.getAlpha() - 5);
        path.addCircle(centerX, centerY, incr, Path.Direction.CCW);
        canvas.clipPath(path, Op.UNION);
        canvas.drawBitmap(bmp2, 0, 0, p1);
        path.reset();
    }
    size += 10;
}

望ましい結果

勾配

これは悪いアプローチだと思いますが、私が考えることができるのはこれだけです。

4

1 に答える 1

2

該当する可能性があるハードウェア アクセラレーションからのいくつかのヒント:

次のリストでは、ハードウェア アクセラレーションでサポートされていない既知の操作について説明します。

Canvas.clipPath()

[...]

描画メソッドでレンダー オブジェクトを作成しない

よくある間違いは、レンダリング メソッドが呼び出されるたびに新しい Paint または新しい Path を作成することです。これにより、ガベージ コレクターがより頻繁に実行されるようになり、ハードウェア パイプラインのキャッシュと最適化もバイパスされます。

また、パスを変更するたびにマスクが生成され、GPU に再アップロードされる (?) ため、頻繁に変更し続けるべきではないことをどこかで読んだり聞いたりしたことがあります。そうです、そのコードはおそらく高速に実行されていません。

これらのビデオに興味があるかもしれません:

編集:実際の代替手段はわかりませんが、パスを使用する以外に方法がない場合は、変更せずにそれらの配列を保持できます。ただし、アニメーションに多くのフレームがある場合は、おそらく大量のメモリが必要になります。

于 2012-08-29T13:04:27.367 に答える