0

我正在尝试用手指画线,我想用多色画线,一切都很好。但是发生的情况是,当我第一次画一条线时,它工作正常,但在那之后,如果我画另一条线,那么第一条线的颜色会因此而丢失,它会变成一条单色线。

任何参考链接也很感激..!!!!

提前致谢。

4

2 回答 2

3

我只能假设颜色之间的差异取决于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,并查看是否有任何差异。

于 2013-01-04T09:48:35.357 回答
1

您的代码所做的只是在绘制每条路径的新段时平滑地更改颜色。这是按行完成的:

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);
                    }
                }
            }
        }
    }
于 2013-01-07T16:59:24.677 回答