形状与绘图
本文档介绍直线(Line)、矩形(Square)、圆形(Circle)、多边形(Polygon)、折线(PolyLine)以及墨迹(Ink)注释的创建和属性设置。
直线注释(Line)
直线注释用于在页面上绘制一条从起点到终点的线段,支持箭头等端点样式,常用于标注和测量。
端点样式
通过 Markup 类定义的常量设置起点/终点样式:
| 常量 | 值 | 说明 |
|---|---|---|
Markup.e_EndingStyleNone | 0 | 无端点 |
Markup.e_EndingStyleSquare | 1 | 方形端点 |
Markup.e_EndingStyleCircle | 2 | 圆形端点 |
Markup.e_EndingStyleDiamond | 3 | 菱形端点 |
Markup.e_EndingStyleOpenArrow | 4 | 开放箭头 |
Markup.e_EndingStyleClosedArrow | 5 | 封闭箭头 |
Markup.e_EndingStyleButt | 6 | 平头端点 |
Markup.e_EndingStyleROpenArrow | 7 | 反向开放箭头 |
Markup.e_EndingStyleRClosedArrow | 8 | 反向封闭箭头 |
Markup.e_EndingStyleSlash | 9 | 斜线端点 |
核心方法
| 方法 | 说明 |
|---|---|
getStartPoint() / setStartPoint(PointF) | 获取/设置起点坐标 |
getEndPoint() / setEndPoint(PointF) | 获取/设置终点坐标 |
getLineStartStyle() / setLineStartStyle(int) | 获取/设置起点端点样式 |
getLineEndStyle() / setLineEndStyle(int) | 获取/设置终点端点样式 |
getStyleFillColor() / setStyleFillColor(int) | 获取/设置端点填充颜色 |
hasCaption() / enableCaption(boolean) | 是否有标题/启用标题 |
getCaptionOffset() / setCaptionOffset(PointF) | 获取/设置标题偏移 |
示例:创建带箭头的直线注释
java
import com.foxit.sdk.common.fxcrt.PointF;
import com.foxit.sdk.common.fxcrt.RectF;
import com.foxit.sdk.pdf.PDFPage;
import com.foxit.sdk.pdf.annots.Annot;
import com.foxit.sdk.pdf.annots.Line;
import com.foxit.sdk.pdf.annots.Markup;
PDFPage page = doc.getPage(0);
RectF rect = new RectF(100, 300, 400, 350);
Line line = new Line(page.addAnnot(Annot.e_Line, rect));
line.setStartPoint(new PointF(100, 325));
line.setEndPoint(new PointF(400, 325));
// 起点无端点,终点为封闭箭头
line.setLineStartStyle(Markup.e_EndingStyleNone);
line.setLineEndStyle(Markup.e_EndingStyleClosedArrow);
line.setBorderColor(0xffff0000);
line.setContent("请关注此区域。");
line.resetAppearanceStream();
矩形注释(Square)与圆形注释(Circle)
矩形和圆形注释用于在页面上绘制框选标记,均支持边框颜色和内部填充颜色。
示例:创建矩形注释
java
import com.foxit.sdk.common.fxcrt.RectF;
import com.foxit.sdk.pdf.PDFPage;
import com.foxit.sdk.pdf.annots.Annot;
import com.foxit.sdk.pdf.annots.Square;
PDFPage page = doc.getPage(0);
RectF rect = new RectF(100, 600, 300, 700);
Square square = new Square(page.addAnnot(Annot.e_Square, rect));
square.setBorderColor(0xff0000ff); // 蓝色边框
square.setFillColor(0x330000ff); // 半透明蓝色填充
square.setOpacity(0.8f);
square.setContent("标记区域");
square.resetAppearanceStream();
示例:创建圆形注释
java
import com.foxit.sdk.common.fxcrt.RectF;
import com.foxit.sdk.pdf.PDFPage;
import com.foxit.sdk.pdf.annots.Annot;
import com.foxit.sdk.pdf.annots.Circle;
PDFPage page = doc.getPage(0);
RectF rect = new RectF(100, 400, 250, 500);
Circle circle = new Circle(page.addAnnot(Annot.e_Circle, rect));
circle.setBorderColor(0xffff6600); // 橙色边框
circle.setFillColor(0x22ff6600); // 半透明橙色填充
circle.setContent("重点内容");
circle.resetAppearanceStream();
多边形注释(Polygon)与折线注释(PolyLine)
多边形和折线注释由多个顶点定义:多边形自动闭合首尾形成封闭区域,折线则保持开放。
示例:创建多边形注释
java
import com.foxit.sdk.common.fxcrt.PointF;
import com.foxit.sdk.common.fxcrt.PointFArray;
import com.foxit.sdk.common.fxcrt.RectF;
import com.foxit.sdk.pdf.PDFPage;
import com.foxit.sdk.pdf.annots.Annot;
import com.foxit.sdk.pdf.annots.Markup;
PDFPage page = doc.getPage(0);
RectF rect = new RectF(100, 200, 300, 350);
Markup polygon = new Markup(page.addAnnot(Annot.e_Polygon, rect));
// 设置顶点
PointFArray vertices = new PointFArray();
vertices.add(new PointF(150, 200));
vertices.add(new PointF(300, 250));
vertices.add(new PointF(280, 350));
vertices.add(new PointF(120, 330));
polygon.setVertexes(vertices);
polygon.setBorderColor(0xff009900);
polygon.resetAppearanceStream();
墨迹注释(Ink)
墨迹注释记录用户的手绘轨迹,是手写批注、自由绘图等场景的基础。Ink 注释通过 Path 对象描述笔迹路径。
Path 对象
Path 是描述墨迹笔画的核心数据结构,支持以下操作:
| 方法 | 说明 |
|---|---|
moveTo(PointF) | 开始新笔画(移动到起点) |
lineTo(PointF) | 从当前位置画直线到指定点 |
cubicBezierTo(PointF, PointF, PointF) | 从当前位置画三次贝塞尔曲线 |
closeFigure() | 关闭当前图形路径 |
getPointCount() / getPoint(int) | 获取点数量/指定索引的点 |
示例:创建墨迹注释
java
import com.foxit.sdk.common.fxcrt.PointF;
import com.foxit.sdk.common.fxcrt.RectF;
import com.foxit.sdk.common.Path;
import com.foxit.sdk.pdf.PDFPage;
import com.foxit.sdk.pdf.annots.Annot;
import com.foxit.sdk.pdf.annots.Ink;
PDFPage page = doc.getPage(0);
RectF rect = new RectF(50, 100, 350, 300);
Ink ink = new Ink(page.addAnnot(Annot.e_Ink, rect));
// 构造笔迹路径
Path path = new Path();
path.moveTo(new PointF(60, 150));
path.lineTo(new PointF(120, 200));
path.lineTo(new PointF(200, 160));
path.lineTo(new PointF(300, 250));
ink.setInkList(path);
ink.setBorderColor(0xff000000);
ink.setOpacity(0.9f);
ink.resetAppearanceStream();
提示
如果希望使用贝塞尔曲线实现更平滑的手绘效果,可调用 ink.enableUseBezier(true) 启用贝塞尔模式。