16. 3. 4. 字体旋转Rotate a line of character (String)AffineTransform

 

import java.awt.Font;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.RenderingHints;
import java.awt.Shape;
import java.awt.font.FontRenderContext;
import java.awt.font.GlyphVector;
import java.awt.geom.AffineTransform;
import java.awt.geom.Point2D;

import javax.swing.JFrame;
import javax.swing.JPanel;


public class RotatedText extends JPanel{
	
	public void paint(Graphics g){
		Graphics2D g2d = (Graphics2D)g;
		//Rendering:渲染、效果图  Hint:提示
		//RenderingHints 类定义和管理键和关联值的集合,它允许应用程序将输入提供给其他类使用的算法选择,
		//这些类执行呈现和图像处理服务。key_antialiasing抗锯齿提示键。
		//value_antialias抗锯齿提示值——使用抗锯齿模式完成呈现.antialias :平滑
		g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
		
		String s = "你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好";
		Font font = new Font("Courier", Font.PLAIN, 12);
		//translate:将 Graphics2D 上下文的原点平移到当前坐标系中的点 (x, y)。
		g2d.translate(20, 20);//translate:翻译、转化、调动
		
		//FontRenderContext 类是正确测量文本所需的信息容器。
		FontRenderContext frc = g2d.getFontRenderContext();//获取此 Graphics2D 上下文中 Font 的呈现上下文。
		
		//GlyphVector 对象是一个字形的集合,包含在转换坐标空间中放置每个字形的几何信息,
		//该坐标空间对应于最终要显示 GlyphVector 的设备。 glyph:字形,标志符号
		//根据此 Font 中的 Unicode cmap 将字符一一映射到字形,从而创建一个 GlyphVector。
		GlyphVector gv = font.createGlyphVector(frc, s);
		
		int length = gv.getNumGlyphs();//返回此 GlyphVector 中的字形数。 
		for(int i = 0; i < length; i++){
			Point2D p = gv.getGlyphPosition(i);//Point2D 类定义表示 (x,y) 坐标空间中位置的点。
			/**
			 * AffineTransform 类表示 2D 仿射变换,它执行从 2D 坐标到其他 2D 坐标的线性映射,保留了线的“直线性”和“平行性”。
			 * 可以使用一系列平移 (translation)、缩放 (scale)、翻转 (flip)、旋转 (rotation) 和错切 (shear) 来构造仿射变换。
			 */
			AffineTransform at = AffineTransform.getTranslateInstance(p.getX(), p.getY());
			/**getTranslateInstance()
			 * 返回表示平移变换的变换。表示返回变换的矩阵是: 
                [   1    0    tx  ]
                [   0    1    ty  ]
                [   0    0    1   ]
                	参数:
			tx - 坐标在 X 轴方向上平移的距离
			ty - 坐标在 Y 轴方向上平移的距离 
			 */
			//rotate:使旋转
			/**
			 * 连接此变换与旋转变换。这等效于调用 concatenate(R),其中 R 为 AffineTransform,由以下矩阵表示: 
                [   cos(theta)    -sin(theta)    0   ]
                [   sin(theta)     cos(theta)    0   ]
                [       0              0         1   ]
 			用正角度 theta 进行的旋转将 X 正半轴上的点向 Y 正半轴旋转。还要注意上文处理 90 度旋转的讨论。 
			参数:
			theta - 用弧度测量的旋转角度
			 */
			at.rotate((double)i / (double)(length - 1) * Math.PI / 3);
			
			//getGlyphOutline()返回其内部区域与此 GlyphVector 中指定字形的可视表示形式对应的 Shape。
			//此方法返回的轮廓位于各个字形的原点周围。
			Shape glyph = gv.getGlyphOutline(i);
			Shape transformedGlyph = at.createTransformedShape(glyph);
			g2d.fill(transformedGlyph);			
		}	
	}

	public static void main(String[] args) {
		JFrame f = new JFrame();
		f.add(new RotatedText());
		f.setSize(400,300);
		f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		f.setLocationRelativeTo(null);
		f.setVisible(true);
	}

}


 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值