今天要谈的是如何在Java中调整字距与行距,当然,这里谈的主要是针对swing与awt里的字距与行距。
调整字距与行距看起来似乎是个很简单的问题,大概可以直接调用某个内置的方法来操作,紫雾我最开始也是这么觉得的,但找了一圈也没发现相关方法,没办法,自己写吧,毕竟也不难。
其实调整字距的方法有很多种,本文介绍其中一种,即直接指定每个字符的初始位置,从而自由调控字距与行距。其实实现手段还有很多种,我过些天应该还会再写一篇文章介绍其他方法,所以这篇文章也就算是“其一”了。
废话不多说了,直接上代码。
import java.awt.*;
import java.awt.image.*;
import java.io.*;
import javax.imageio.*;
public class demo1_NewDraw{
public static void main(String[] args) throws Exception{
int width=150;
int height=30;
String out=new String("今夕是何年?");
double rate=0.90;
BufferedImage image=new BufferedImage(width,height,BufferedImage.TYPE_INT_BGR);
Graphics g=image.getGraphics();//创建画笔
g.setColor(new Color(200,192,184));//背景颜色
g.fill3DRect(0, 0, width, height, true);//背景
g.setColor(Color.BLACK);//文字颜色
g.setFont(new Font("宋体",Font.BOLD,20));//设置字体
//居中显示
int x=(int)(width/2-rate*g.getFontMetrics().stringWidth(out)/2);
int y=height/2+g.getFontMetrics().getHeight()/3;
MyDrawString(out, x, y, rate, g);
ImageIO.write(image, "png", new File("d:/2.png"));
}
public static void MyDrawString(String str,int x,int y,double rate,Graphics g){
String tempStr=new String();
int orgStringWight=g.getFontMetrics().stringWidth(str);
int orgStringLength=str.length();
int tempx=x;
int tempy=y;
while(str.length()>0)
{
tempStr=str.substring(0, 1);
str=str.substring(1, str.length());
g.drawString(tempStr, tempx, tempy);
tempx=(int)(tempx+(double)orgStringWight/(double)orgStringLength*rate);
}
}
}
核心部分就是那个MyDrawString,也就是我自己写的可以自由控制字间距的DrawSting。该函数和java固有的DrawString一样,参数依次为“要输出的字符串”、“x坐标”、“y坐标”,后面的rate是一个double类型,表示此次绘制的字间距是默认字间距的多少倍,g是画笔。
需要注意的是,由于使用了不同的绘制文字方法,所以这里的文字居中方案也要有所调整,上面程序里面给了一种解决方案,供参考。
上述程序虽然只做了字距调整,但实际上调整行距也是一样的道理,只要改tempy就行了,这里不再赘述。
最后,口说无凭,上个效果图大家感受一下。
原始间距:
1.2倍间距:
0.9倍间距:
额,这里说点无关的。记得最开始学java的时候就听说过java不擅长处理图像,现在渐渐感觉到了。