Superdry Memorandom :-p

旧「superdry memorandum :-D」です

android.graphic.Shaderクラスについて

今回SuperdryColorPickerを作るにあたってぶちあたったShaderクラス。グラデーションとか陰影をつけるクラスで、以下のサブクラスがあります。

  • BitmapShader
  • ComposeShader
  • LinearGradient
  • RadialGradient
  • SweepGradient

Shaderに関係するものとして以下の引数があります。

  • Shader.TileMode
  • PorterDuff.Mode
  • Xfermode

Shader.TileMode

どういう加工をするか

Shader.TileMode CLAMP オリジナルの画像の外側にシェーダが描画される場合エッジカラーをコピーする
Shader.TileMode MIRROR シェーダ画像が水平垂直方向に鏡像で繰り返される
Shader.TileMode REPEAT シェーダ画像が水平垂直方向に繰り返される

PorterDuff.Mode

どういう合成をするか。このあたりはAPI Demosのgraphics-Xfermodeをみれば一目瞭然かと。Xfermodeのテンプレートである。

Xfermode

PorterDuff.Modeにないモードで合成したい場合Xfermodeを使う。Xfermodeは描画パイプラインへカスタマイズされた「変換モード」を実装するときに呼ばれるオブジェクトの基底クラス。事前に定義されたサブクラスを列挙型Modesで特定でき、Create(Modes)でインスタンスを返す。Paintにxfermodeを設定すると、オブジェクトはxfermodeが適用されたPaintで描画される。

BitmapShader

bitmapに対しシェーダをかけるメソッドです

public BitmapShader (Bitmap bitmap, Shader.TileMode tileX, Shader.TileMode tileY);
bitmap 加工する画像
tileX 水平方向にどういう加工をするか
tileY 垂直方向にどういう加工をするか

ComposeShader

2つのシェーダをモードにあわせて合成するメソッドです。

public ComposeShader (Shader shaderA, Shader shaderB, Xfermode mode)
public ComposeShader (Shader shaderA, Shader shaderB, PorterDuff.Mode mode)

この場合shader Aがdst、shader Bがsrcとなる。modeがnullの場合は、SRC_OVERが適用されます。

LinearGradient

線状のグラデーションを書くシェーダ。

//複数色
LinearGradient(float x0, float y0, float x1, float y1, int[] colors, float[] positions, Shader.TileMode tile)
//二色
LinearGradient(float x0, float y0, float x1, float y1, int color0, int color1, Shader.TileMode tile)

引数の意味は以下のとおり

x0, y0 始点
x1, y1 終点
color0 始点の色
color1 終点の色
colors[] グラデーション配列
positions[] 位置情報普通null)

RadialGradient

中心点と半径から円形のグラデーションを描くシェーダ(グラデーション方向は中心からエッジに向かって)。

RadialGradient(float x, float y, float radius, int[] colors, float[] positions, Shader.TileMode tile)
RadialGradient(float x, float y, float radius, int color0, int color1, Shader.TileMode tile)

引数の意味は以下のとおり

x, y 中心点
radius 半径
color0 中心点の色
color1 エッジの色の色
colors[] グラデーション配列

SweepGradient

中心点と半径から円形のグラデーションを描くシェーダ(グラデーション方向は円弧に沿って)。

SweepGradient(float cx, float cy, int[] colors, float[] positions)
SweepGradient(float cx, float cy, int color0, int color1)

引数の意味は以下のとおり

x, y 中心点
color0 始点の色
color1 終点の色
colors[] グラデーション配列