如何在Java Graphics2D中绘制可描摹的实心数字3?
实现描红本式实心可描摹数字的Graphics2D修改方案
你的代码当前生成的是虚线轮廓的空心数字,原因是你对数字的轮廓Shape做了虚线描边后再填充,最终得到的是虚线构成的空心区域。要实现描红本那种「实心数字底色+虚线描摹轨迹」的效果,需要调整绘制逻辑:先画实心数字作为底,再在数字的笔画路径上绘制虚线。
修改后的代码示例
float[] textDash = {15.0f}; g2d.setFont(g2d.getFont().deriveFont(400f)); String numberString = "3"; // 获取数字的字形轮廓 FontRenderContext frc = g2d.getFontRenderContext(); GlyphVector gv = g2d.getFont().createGlyphVector(frc, numberString); Shape numberShape = gv.getOutline(); // 平移到目标位置 AffineTransform at = AffineTransform.getTranslateInstance(30, 200); numberShape = at.createTransformedShape(numberShape); // 1. 绘制实心数字作为底色(用浅灰色模拟描红本的淡底色) g2d.setColor(Color.LIGHT_GRAY); g2d.fill(numberShape); // 2. 创建虚线笔触,绘制数字的轮廓虚线(黑色作为描摹轨迹) BasicStroke dashedStroke = new BasicStroke(5f, BasicStroke.CAP_BUTT, BasicStroke.JOIN_MITER, 10.0f, textDash, 0.0f); g2d.setColor(Color.BLACK); g2d.setStroke(dashedStroke); g2d.draw(numberShape);
关键修改点说明
- 移除了
dashedStroke.createStrokedShape(numberStringOutline)步骤:原来的逻辑是把轮廓转成虚线形状再填充,得到空心虚线效果;现在直接用虚线笔触绘制原始数字轮廓Shape。 - 新增实心底色绘制:先填充数字Shape形成实心底,再叠加虚线描边,完全还原描红本的样式——孩子可以沿着黑色虚线描摹,底色的实心数字起到参照作用。
内容的提问来源于stack exchange,提问作者Quillion
相关产品推荐
相关产品推荐

