Android の (2D) Canvas 描画パイプラインのコンポーネントがどのように組み合わされるかについて、よりよく理解したいと思います。
たとえば、XferMode、Shader、MaskFilter、およびColorFilterはどのように相互作用しますか? これらのクラスのリファレンス ドキュメントはかなりまばらで、CanvasとPaintのドキュメントには有用な説明がまったく追加されていません。
また、固有の色を持つ描画操作 (例:drawBitmap
と のような「ベクトル」プリミティブdrawRect
) がこれらすべてにどのように適合するかは、私には完全には明らかではありません。それらは常に の色を無視し、Paint
代わりに固有の色を使用しますか?
また、次のようなことができるという事実にも驚きました。
Paint eraser = new Paint();
eraser.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.CLEAR));
canvas.drawOval(rectF, eraser);
これにより、楕円が消去されます。これに気付く前に、私のメンタルモデルは、キャンバスへの描画は(概念的に)別の「レイヤー」に描画され、そのレイヤーはペイントの転送モードを使用してキャンバスのビットマップで構成されるというものでした。CLEAR はソースのアルファに関係なく常に色 (およびアルファ) を 0 に設定するため、それがそれほど単純である場合、上記のコードはビットマップ全体 (クリッピング領域内) を消去します。したがって、これは、消去を楕円形に制限するために、追加の種類のマスキングが行われていることを意味します。
私はAPI デモを見つけましたが、各デモは「真空状態で」動作し、焦点を当てているもの (例: XferModes) が他のもの (例: ColorFilters) とどのように相互作用するかを示していません。
十分な時間と労力をかけて、これらの部分がどのように関連しているか、ソースを解読するかを経験的に理解することができましたが、他の誰かがすでにこれを解決しているか、パイプライン/描画モデルの実際のドキュメントがあることを願っています.私は逃した。
この質問は、別の SO question に対するこの回答のコードを見て触発されました。
アップデート
いくつかのドキュメントを探しているときに、ここで私が興味を持っているものの多くはskiaの上にあるかなり薄いベニヤのように見えるので、役立つスキーのドキュメントがいくつかあることに気づきました。私が見つけることができる最高のものは、次のようなドキュメントですSkPaint
。
ペイントに割り当てることができる効果には 6 種類あります。
- SkPathEffect - アルファ マスクを生成する前のジオメトリ (パス) への変更 (ダッシュなど)
- SkRasterizer - カスタム マスク レイヤー (シャドウなど) の作成
- SkMaskFilter - 色付けして描画する前のアルファ マスクの変更 (ぼかし、エンボスなど)
- SkShader - グラデーション (リニア、ラジアル、スイープ)、ビットマップ パターン (クランプ、リピート、ミラー) など
- SkColorFilter - xfermode を適用する前にソース カラーを変更します (カラー マトリックスなど)。
- SkXfermode - 例: porter-duff 転送モード、ブレンド モード
明示的には述べられていませんが、ここでの効果の順序は、パイプラインに表示される順序であると推測しています。