在PDF文档编辑场景中,圆角矩形是常用的图形元素,而贝赛尔曲线凭借其灵活的曲线控制能力,是绘制圆角矩形的核心实现方式。本文将以利用贝赛尔曲线绘制PDF圆角矩形为核心,明确实现思路,并提供示例代码,帮助开发者快速掌握相关操作方法,适配各类PDF图形编辑需求。
示例代码如下:
page= doc.insertPage(doc.getPageCount(), PDFPage.e_SizeA4);
page.startParse(0,null,true);
float page_width = page.getWidth();
float page_height = page.getHeight();
float start_x = 30;
float start_y =page_height- 60;
//圆角半径
float r=18;
//左上角为30,60 高度为70的矩形
//依次为顺时针:左上,右上,右下,左下四个点
PointF p1=new PointF(start_x,start_y-30);
PointF p2=new PointF(page_width- start_x,start_y-30);
PointF p3=new PointF(page_width- start_x,start_y-100);
PointF p4=new PointF(start_x,start_y-100);
AddRoundedRectangle(page,r,p1,p2,p3,p4);
//绘制圆角矩形的实现
public static void AddRoundedRectangle(PDFPage page,float r, PointF p1,PointF p2,PointF p3,PointF p4) throws PDFException {
long position = page.getLastGraphicsObjectPosition(e_TypePath);
PathObject path_object = PathObject.create();
Path path = new Path();
//绘制贝塞尔曲线
path.moveTo(new PointF( p1.getX() + r, p1.getY()));
// 上边线:从左上角右侧到右上角左侧
path.lineTo(new PointF( p2.getX() - r, p2.getY()));
// 使用三次贝塞尔曲线绘制1/4圆形
// 控制点1:右上角顶点(水平方向控制点)
// 控制点2:右上角下方r距离处(垂直方向控制点)
// 终点:右上角右下方r距离处(1/4圆的结束点)
path.cubicBezierTo (
new PointF( p2.getX()-r/2, p2.getY()), // 第一个控制点
new PointF( p2.getX(), p2.getY() - r/2), // 第二个控制点
new PointF( p2.getX() , p2.getY() - r));//终点
// 右边线:从右上角圆角终点到右下角上方
path.lineTo( new PointF( p3.getX(), p3.getY() + r));
// 右下角圆角
path.cubicBezierTo ( new PointF( p3.getX(), p3.getY()+r/2),
new PointF( p3.getX() - r/2, p3.getY()),
new PointF( p3.getX() - r, p3.getY() ));
// 下边线:从右下角圆角终点到左下角右侧
path. lineTo( new PointF( p4.getX() + r, p4.getY()));
// 左下角圆角
path. cubicBezierTo ( new PointF( p4.getX()+r/2, p4.getY()),
new PointF( p4.getX(), p4.getY() + r/2),
new PointF( p4.getX() , p4.getY() + r));
// 左边线:从左下角圆角终点到左上角下方
path. lineTo( new PointF( p1.getX(), p1.getY() - r));
path. cubicBezierTo ( new PointF( p1.getX(), p1.getY()-r/2),
new PointF( p1.getX()+r/2, p1.getY() ),
new PointF( p1.getX()+r , p1.getY() ));
path_object.setPathData(path);
path_object.setFillColor(0xFF000000);
path_object.setFillMode(e_FillModeAlternate);
path_object.setStrokeState(true);
path_object.setStrokeColor(0xFF000000);
path_object.setFillMode(0);
page.insertGraphicsObject(position, path_object);
page.generateContent();
}
绘制结果如下: