我正在尝试用手指画线,我想用多色画线,一切都很好。但是发生的情况是,当我第一次画一条线时,它工作正常,但在那之后,如果我画另一条线,那么第一条线的颜色会因此而丢失,它会变成一条单色线。
任何参考链接也很感激..!!!!
提前致谢。
我正在尝试用手指画线,我想用多色画线,一切都很好。但是发生的情况是,当我第一次画一条线时,它工作正常,但在那之后,如果我画另一条线,那么第一条线的颜色会因此而丢失,它会变成一条单色线。
任何参考链接也很感激..!!!!
提前致谢。
我只能假设颜色之间的差异取决于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);
}
}
}
}
}