PorterDuff を使って角丸プログレスバーを作る
Jun 7, 2020 08:03 · 86 words · 1 minute read
2つの画像を合成するときに使える PorterDuff を利用して角丸プログレスバー作りました
PorterDuff とは
2つの画像を組み合わせるときのいくつかのルールを提供している便利なスキーマみたいなものです(雑な理解)
例えば、大きさの異なる2つの円を用意して PorterDuff を使えばドーナッツみたいにくり抜くこともできます。
PorterDuff を利用して角丸プログレスバーを作る
Githubで検索すると角丸プログレスバーはいくつかでてくるのですが、両端が角丸になっているものが多かったので片側(進行方向)は垂直に切れているプログレスバーを作ってみることにしました。
手順はまず初めに背景となる角丸の Retangle を描画してその上にプログレスバーとなる角丸ではない Rectangle を描画します。 描画する際に使用する Paint に重ね合わせるときのルールを指定することで背景画像に対してどう切り取るか、描画順序はどうするかを決めることができます。
leftBarPaint = Paint().apply {
color = leftColor
xfermode = PorterDuffXfermode(PorterDuff.Mode.SRC_IN)
}
rightBarPaint = Paint().apply {
color = rightColor
xfermode = PorterDuffXfermode(PorterDuff.Mode.SRC_IN)
}
backgroundPaint = Paint().apply {
color = Color.BLACK
}
canvas.drawRoundRect(
0F,
0F,
this.width.toFloat(),
this.height.toFloat(),
radius.px(),
radius.px(),
backgroundPaint
)
canvas.drawRoundRect(
progressCurrentWidth.toFloat(),
0F,
this.width.toFloat(),
this.height.toFloat(),
0F,
0F,
rightBarPaint
)
canvas.drawRoundRect(
0F,
0F,
progressCurrentWidth.toFloat(),
this.height.toFloat(),
0F,
0F,
leftBarPaint
)
まとめ
複雑な図形も PorterDuff を使えば簡単に描画できるケースもあることが分かりました。 ソースコードは Github に載せているので何かの助けになれば幸いです