PathStrokeType(轨迹描边)详解

Path对象所描述的形状,不仅可以由Graphics对象直接填充,还可以只进行描边式绘制,即素描式绘制。比如:轨迹对象描绘的曲线等线型只是一个概念,并无宽度,此时就需要给该曲线一个宽度值,画刷描边后才可看到预想的结果。要实现此功能,需用到PathStrokeType轨迹描边类。前面的代码中已有涉及,本小节再补充一些技巧。

 可将某个轨迹的描边结果赋值给另一个轨迹,目标轨迹所描述的形状即仅仅是边线,而不再是形状
 轨迹对象也可以自行修改,将当前所描述的形状改为该形状的描边
 可在内容组件类的resized()函数中设置轨迹和轨迹描边,在paint()函数中填充

// 定义一个轨迹描边对象,描边的宽度为5.0像素
PathStrokeType wideStroke (5.0f);

// 将轨迹对象linePath描边结果赋值给另一个轨迹对象hitPath。
// 而后在paint()里画刷填充hitPath。这么做的目的是,并不针对hitPath进行描边,
// 而是将linePath的边线作为轨迹内容赋值给hitPath,
// 而后Graphics对象直接调用fillPath()填充hitPath。其实就相当于是只填充了一个边线
wideStroke.createStrokedPath (hitPath, linePath);

// 再定义一个轨迹描边对象,描边宽度为2.5像素
PathStrokeType stroke (2.5f);

// 轨迹对象linePath的描边结果赋值给自己,即自我修改。linePath当前的形状为一个三阶曲线
stroke.createStrokedPath (linePath, linePath);    

// 以下为将一个箭头形状添加到轨迹对象linePath中。先定义两个常量,即箭头的宽度和长度
const float arrowW = 5.0f;
const float arrowL = 4.0f;

// 定义一个描述三角形的轨迹对象
Path arrow;
arrow.addTriangle (-arrowL, arrowW, -arrowL, -arrowW, arrowL, 0.0f);

// 应用仿射变换,实现箭头的指向和曲线的方向是一致的
arrow.applyTransform (AffineTransform::identity
            .rotated (float_Pi * 0.5f - (float) atan2 (x2 - x1, y2 - y1))
            .translated ((x1 + x2) * 0.5f, (y1 + y2) * 0.5f));

// 轨迹对象linePath添加子轨迹
linePath.addPath (arrow);

// 设置吸附(即是否将箭头视为自身的一部分)
linePath.setUsingNonZeroWinding (true);

// 设置完毕,使用Graphics进行填充...

PathStrokeType类的成员函数(网站发表,略)。