私はフィンガーペイントを使って線を描こうとしていますが、その線をマルチカラーで描きたいと思っています。しかし、最初に線を引くとうまくいきますが、その後別の線を引くと、最初の線の色が失われ、単色の線のようになります。
参照リンクも大歓迎です..!!!!
前もって感謝します。
私はフィンガーペイントを使って線を描こうとしていますが、その線をマルチカラーで描きたいと思っています。しかし、最初に線を引くとうまくいきますが、その後別の線を引くと、最初の線の色が失われ、単色の線のようになります。
参照リンクも大歓迎です..!!!!
前もって感謝します。
色の違いはhue
、のサイズから作成されたプロパティに依存すると推測できpointsToDraw
ます。
// set paint to whatever color you want
float hue = (float)i /pointsToDraw.size();
画面に描画するすべての線は、前の線の正確なコピーではないので、pointsToDraw
サイズが異なり、その結果、hue
線ごとに値が異なります。
また、hue
は線の色の生成に使用されるため、新しい線はすべて固有の色になります。
mPaint.setColor(Color.HSVToColor(
new float[] {
hue*360, 1, 1
}));
この仮定をテストするには、に定数値を割り当てて、hue
違いがあるかどうかを確認してください。
コードが行っていることは、各パスの新しいセグメントをペイントするときに色をスムーズに変更することです。これは次の行で行われます。
float hue = (float)i /pointsToDraw.size();
mPaint.setColor(Color.HSVToColor(
new float[] {
hue*360, 1, 1
}));
hue
i は反復変数であるため、スムーズに変化しています。コードの問題は、 を計算する除数として定数値を使用する代わりにhue
、画面上にあったパスの数に応じた値 (つまりpointsToDraw.size()
) を使用していることです。
したがって、次のコードがそれを行うと思います。(私がしたことは、除数を計算するように変更しただけですhue
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
if(clearCanvas)
{ // Choose the colour you want to clear with.
canvas.drawColor(Color.TRANSPARENT, PorterDuff.Mode.CLEAR);
clearCanvas = false;
fl.invalidate();
}else {
synchronized(pointsToDraw)
{
for (ArrayList<Point> paths : pointsToDraw) {
for (int i=0; i<paths.size()-1; ++i) {
// set paint to whatever color you want
float hue = (float)i /(paths.get(0).x+paths.get(0).y);
mPaint.setColor(Color.HSVToColor(
new float[] {
hue*360, 1, 1
}));
canvas.drawLine(paths.get(i).x, paths.get(i).y, paths.get(i+1).x, paths.get(i+1).y, mPaint);
}
}
}
}
}