所有类


java.awt.font
类 TextLayout

java.lang.Object
  继承者 java.awt.font.TextLayout
所有已实现的接口:
Cloneable

public final class TextLayout
   
   
   
   
   
extends Object
implements Cloneable

TextLayout 是样式字符数据的不可变图形表示形式。

它提供以下功能:

  • 隐式双向分析和重排序,
  • 光标定位和移动,包括针对混向文本的拆分光标,
  • 突出显示,包括针对混向文本的逻辑突出显示和可视突出显示,
  • 多个 baseline(罗马字体、悬挂和居中),
  • 命中测试,
  • 调整,
  • 默认字体替换,
  • 规格信息,如 ascent、descent 和 advance 以及
  • 呈现

TextLayout 对象可以使用其 draw 方法呈现。

可以直接构造 TextLayout 或通过使用 LineBreakMeasurer 构造它。直接进行构造时,源文本表示一个段落。LineBreakMeasurer 允许带样式的文本断行,以适应特定的宽度。有关的更多信息,请参阅 LineBreakMeasurer 文档。

TextLayout 的逻辑构造过程如下:

  • 提取并检查段落属性,
  • 对文本进行双向重排分析,并在需要时计算重排信息,
  • 根据样式排列对文本进行分段
  • 为样式排列选择的字体,如果存在 TextAttribute.FONT 属性,则首先使用该字体,否则,通过使用已定义的属性计算默认字体
  • 如果文本位于多个基线上,则排列或子排列被进一步拆分为共享公共基线的子排列,
  • 使用所选字体为每个排列生成字形向量,
  • 对字形向量执行最后的双向重排

TextLayout 对象的方法返回的所有图形信息都相对于 TextLayout 的原点,它是 TextLayout 对象的基线与其左边缘的交叉点。而且,还假定传递到 TextLayout 对象的方法的坐标也相对于 TextLayout 对象的原点。客户端通常需要在 TextLayout 对象的坐标系统和另一对象(如 Graphics 对象)中的坐标系统之间进行转换。

根据样式文本创建 TextLayout 对象,但它们不保留对其源文本的引用。因此,对先前用来生成 TextLayout 的文本的改动不会影响 TextLayout

TextLayout 对象的三个方法(getNextRightHitgetNextLeftHithitTestChar)都返回 TextHitInfo 实例。这些 TextHitInfo 对象中的偏移量相对于 TextLayout 的起始处,而不是相对于用于创建 TextLayout 的文本。同样,接受 TextHitInfo 实例作为参数的 TextLayout 方法将 TextHitInfo 对象的偏移量看做相对于 TextLayout,而不是相对于其他任何基础文本存储模型。

示例

构造并绘制 TextLayout 及其边界矩形:

   Graphics2D g = ...;
   Point2D loc = ...;
   Font font = Font.getFont("Helvetica-bold-italic");
   FontRenderContext frc = g.getFontRenderContext();
   TextLayout layout = new TextLayout("This is a string", font, frc);
   layout.draw(g, (float)loc.getX(), (float)loc.getY());

   Rectangle2D bounds = layout.getBounds();
   bounds.setRect(bounds.getX()+loc.getX(),
                  bounds.getY()+loc.getY(),
                  bounds.getWidth(),
                  bounds.getHeight());
   g.draw(bounds);
 

TextLayout 进行命中测试(确定哪个字符位于特定图形位置上):

   Point2D click = ...;
   TextHitInfo hit = layout.hitTestChar(
                         (float) (click.getX() - loc.getX()),
                         (float) (click.getY() - loc.getY()));
 

对按下向右方向键进行响应:

   int insertionIndex = ...;
   TextHitInfo next = layout.getNextRightHit(insertionIndex);
   if (next != null) {
       // translate graphics to origin of layout on screen
       g.translate(loc.getX(), loc.getY());
       Shape[] carets = layout.getCaretShapes(next.getInsertionIndex());
       g.draw(carets[0]);
       if (carets[1] != null) {
           g.draw(carets[1]);
       }
   }
 

绘制一个对应于源文本中的子字符串的选择范围。选择的区域在视觉上可能是不连续的:

   // selStart, selLimit should be relative to the layout,
   // not to the source text

   int selStart = ..., selLimit = ...;
   Color selectionColor = ...;
   Shape selection = layout.getLogicalHighlightShape(selStart, selLimit);
   // selection may consist of disjoint areas
   // graphics is assumed to be tranlated to origin of layout
   g.setColor(selectionColor);
   g.fill(selection);
 

绘制一个视觉上连续的选择范围。选择范围可能对应源文本中的多个子字符串。通过 getLogicalRangesForVisualSelection() 可以获得相应源文本的子字符串范围:

   TextHitInfo selStart = ..., selLimit = ...;
   Shape selection = layout.getVisualHighlightShape(selStart, selLimit);
   g.setColor(selectionColor);
   g.fill(selection);
   int[] ranges = getLogicalRangesForVisualSelection(selStart, selLimit);
   // ranges[0], ranges[1] is the first selection range,
   // ranges[2], ranges[3] is the second selection range, etc.
 

另请参见:
LineBreakMeasurer, TextAttribute, TextHitInfo

嵌套类摘要
static class TextLayout.CaretPolicy
          定义确定强插入符位置的策略。
 
字段摘要
static TextLayout.CaretPolicy DEFAULT_CARET_POLICY
          客户端未指定策略时使用此 CaretPolicy
 
构造方法摘要
TextLayout(AttributedCharacterIterator text, FontRenderContext frc)
          根据样式文本上的迭代器构造一个 TextLayout
TextLayout(String string, Font font, FontRenderContext frc)
          根据 StringFont 构造一个 TextLayout
TextLayout(String string, Map<? extends AttributedCharacterIterator.Attribute,?> attributes, FontRenderContext frc)
          根据 String 和属性集构造一个 TextLayout
 
方法摘要
protected  Object clone()
          创建此 TextLayout 的副本。
 void draw(Graphics2D g2, float x, float y)
          在指定的 Graphics2D 上下文中的指定位置上呈现此 TextLayout
 boolean equals(Object obj)
          如果指定 Object 是一个 TextLayout 对象,且指定的 Object 等于此 TextLayout,则返回 true
 boolean equals(TextLayout rhs)
          如果两个布局相等,则返回 true
 float getAdvance()
          返回此 TextLayout 的 advance。
 float getAscent()
          返回此 TextLayout 的 ascent。
 byte getBaseline()
          返回此 TextLayout 的基线。
 float[] getBaselineOffsets()
          返回用于此 TextLayout 的基线的偏移量数组。
 Shape getBlackBoxBounds(int firstEndpoint, int secondEndpoint)
          返回指定范围中字符的黑框边界。
 Rectangle2D getBounds()
          返回此 TextLayout 的边界。
 float[] getCaretInfo(TextHitInfo hit)
          返回与对应于 hit 的插入符有关的信息。
 float[] getCaretInfo(TextHitInfo hit, Rectangle2D bounds)
          返回与对应于 hit 的插入符有关的信息。
 Shape getCaretShape(TextHitInfo hit)
          返回表示此 TextLayout 的自然边界中指定目标字符处的插入符的 Shape
 Shape getCaretShape(TextHitInfo hit, Rectangle2D bounds)
          返回表示指定边界内指定目标字符处的插入符的 Shape
 Shape[] getCaretShapes(int offset)
          返回对应于强插入符和弱插入符的两条路径。
 Shape[] getCaretShapes(int offset, Rectangle2D bounds)
          返回对应于强插入符和弱插入符的两条路径。
 Shape[] getCaretShapes(int offset, Rectangle2D bounds, TextLayout.CaretPolicy policy)
          返回对应于强插入符和弱插入符的两条路径。
 int getCharacterCount()
          返回由此 TextLayout 表示的字符数。
 byte getCharacterLevel(int index)
          返回 index 处字符的级别。
 float getDescent()
          返回此 TextLayout 的 descent。
 TextLayout getJustifiedLayout(float justificationWidth)
          创建调整到指定宽度的此 TextLayout 的一个副本。
 float getLeading()
          返回 TextLayout 的行距。
 Shape getLogicalHighlightShape(int firstEndpoint, int secondEndpoint)
          返回封闭指定范围中逻辑选择范围的 Shape,它扩展到了此 TextLayout 的自然边界。
 Shape getLogicalHighlightShape(int firstEndpoint, int secondEndpoint, Rectangle2D bounds)
          返回封闭指定范围中扩展到指定 bounds 的逻辑选择范围的 Shape
 int[] getLogicalRangesForVisualSelection(TextHitInfo firstEndpoint, TextHitInfo secondEndpoint)
          返回对应于可视选择范围的逻辑文本范围。
 TextHitInfo getNextLeftHit(int offset)
          返回下一个插入符左侧(顶部)的目标字符;如果没有这种字符,则返回 null
 TextHitInfo getNextLeftHit(int offset, TextLayout.CaretPolicy policy)
          返回下一个插入符左侧(顶部)的目标字符;如果没有这种字符,则返回 null
 TextHitInfo getNextLeftHit(TextHitInfo hit)
          返回下一个插入符左侧(顶部)的目标字符;如果没有这种字符,则返回 null
 TextHitInfo getNextRightHit(int offset)
          返回下一个插入符右侧(底部)的目标字符;如果没有这种字符,则返回 null
 TextHitInfo getNextRightHit(int offset, TextLayout.CaretPolicy policy)
          返回下一个插入符右侧(底部)的目标字符;如果没有这种字符,则返回 null
 TextHitInfo getNextRightHit(TextHitInfo hit)
          返回下一个插入符右侧(底部)的目标字符;如果没有这种字符,则返回 null
 Shape getOutline(AffineTransform tx)
          返回表示此 TextLayout 的轮廓的 Shape
 float getVisibleAdvance()
          返回此 TextLayout 的 advance 与结尾空白的差。
 Shape getVisualHighlightShape(TextHitInfo firstEndpoint, TextHitInfo secondEndpoint)
          返回封闭指定范围中扩展到指定边界的可视选择范围的 Shape
 Shape getVisualHighlightShape(TextHitInfo firstEndpoint, TextHitInfo secondEndpoint, Rectangle2D bounds)
          返回封闭指定范围中扩展到 bounds 的可视选择范围的路径。
 TextHitInfo getVisualOtherHit(TextHitInfo hit)
          返回位于指定目标字符的插入符另一侧的目标字符。
protected  void handleJustify(float justificationWidth)
          调整此布局。
 int hashCode()
          返回此 TextLayout 的哈希码。
 TextHitInfo hitTestChar(float x, float y)
          返回对应于指定点的 TextHitInfo
 TextHitInfo hitTestChar(float x, float y, Rectangle2D bounds)
          返回对应于指定点的 TextHitInfo
 boolean isLeftToRight()
          如果此 TextLayout 的基本方向是从左到右,则返回 true;如果基本方向是从右到左,则返回 false
 boolean isVertical()
          如果此 TextLayout 是垂直的,则返回 true
 String toString()
          返回此 TextLayout 的调试信息。
 
从类 java.lang.Object 继承的方法
finalize, getClass, notify, notifyAll, wait, wait, wait
 

字段详细信息

DEFAULT_CARET_POLICY

public static final TextLayout.CaretPolicy DEFAULT_CARET_POLICY
客户端未指定策略时使用此 CaretPolicy。对于此策略,方向与行方向相同的字符的命中要强于对反方向字符的命中。如果字符的方向相同,则对字符开始边的命中要强于对字符结尾边的命中。

构造方法详细信息

TextLayout

public TextLayout(String string,
                  Font font,
                  FontRenderContext frc)
根据 StringFont 构造一个 TextLayout。使用指定的 Font 样式化所有文本。

String 必须指定单个文本段,因为双向算法需要整个段落。

参数:
string - 要显示的文本
font - 用于样式化文本的 Font
frc - 包含关于正确测量文本所需的图形设备的信息。根据设备分辨率和属性(如抗锯齿)的不同,文本测量可能稍有变化。此参数未指定 TextLayout 和用户空间之间的转换。

TextLayout

public TextLayout(String string,
                  Map<? extends AttributedCharacterIterator.Attribute,?> attributes,
                  FontRenderContext frc)
根据 String 和属性集构造一个 TextLayout

使用提供的属性样式化所有文本。

String 必须指定单个文本段,因为双向算法需要整个段落。

参数:
string - 要显示的文本
attributes - 用于样式化文本的属性
frc - 包含关于正确测量文本所需的图形设备的信息。根据设备分辨率和属性(如抗锯齿)的不同,文本测量可能稍有变化。此参数未指定 TextLayout 和用户空间之间的转换。

TextLayout

public TextLayout(AttributedCharacterIterator text,
                  FontRenderContext frc)
根据样式文本上的迭代器构造一个 TextLayout

该迭代器必须指定单个文本段,因为双向算法需要整个段落。

参数:
text - 要显示的样式文本
frc - 包含关于正确测量文本所需的图形设备的信息。根据设备分辨率和属性(如抗锯齿)的不同,文本测量可能稍有变化。此参数未指定 TextLayout 和用户空间之间的转换。
方法详细信息

clone

protected Object clone()
创建此 TextLayout 的副本。

覆盖:
Object 中的 clone
返回:
此实例的一个克隆。
另请参见:
Cloneable

getJustifiedLayout

public TextLayout getJustifiedLayout(float justificationWidth)
创建调整到指定宽度的此 TextLayout 的一个副本。

如果已调整了此 TextLayout,则抛出异常。如果此 TextLayout 对象的调整率为零,将返回与此 TextLayout 相同的 TextLayout

参数:
justificationWidth - 调整行时使用的宽度。要获得最佳结果,该宽度与行的当前 advance 不应有太大差别。
返回:
调整到指定宽度的 TextLayout
抛出:
Error - 如果已调整了此布局,则抛出 Error。

handleJustify

protected void handleJustify(float justificationWidth)
调整此布局。子类重写该方法来控制调整(如果存在子类,即...) 只在段落属性(来自源文本,可以是布局属性的默认值)指示一个非零调整率时才调整布局。将文本调整到指示的宽度。当前实现还调整标点和尾部空白,使其接近于调整宽度。调整布局之后将不会对其进行再调整。

某些代码依赖于布局的不可变性。因此子类不应直接调用该方法,而是应调用 getJustifiedLayout,getJustifiedLayout 将在此布局的副本上调用此方法,而保留原始布局。

参数:
justificationWidth - 调整行时使用的宽度。要获得最佳结果,该宽度与行的当前 advance 不应有太大差别。
另请参见:
getJustifiedLayout(float)

getBaseline

public byte getBaseline()
返回此 TextLayout 的基线。基线是 Font 中定义的一个值,它可以是 roman、centered 或 hanging。Ascent 和 descent 相对于此基线。baselineOffsets 也相对于此基线。

返回:
TextLayout 的基线。
另请参见:
getBaselineOffsets(), Font

getBaselineOffsets

public float[] getBaselineOffsets()
返回用于此 TextLayout 的基线的偏移量数组。

该数组用 Font 中定义的 roman、centered 或 hanging 值之一进行索引。这些值相对于此 TextLayout 对象的基线,所以 getBaselineOffsets[getBaseline()] == 0。将偏移量添加到 TextLayout 对象基线所在的位置处,以获取新基线的位置。

返回:
包含用于此 TextLayout 的基线的偏移量数组。
另请参见:
getBaseline(), Font

微信小程序

微信扫一扫体验

微信公众账号

微信扫一扫加关注

发表
评论
返回
顶部