java繪圖drawString位置的肯定

根據api,很容易知道使用方式以下:java

指定字符串和座標便可。

可是簡單認爲字符串的起始位置就是左上頂點就錯了,這樣畫起來每次的位置都不對,字體的大小不一樣,位置誤差很大。仔細看api註釋後發現,y座標是字符串基線位置的座標,也就是說字符串基線與畫布y重合。

字體的高由個元素組成:
ascent
descent

drawString中用的y座標是指baseline的y座標,即字體所在矩形的左上角y座標+ascent

 

改進後的示例代碼:
        BufferedImage srcBi = xxx;

        int owidth = srcBi.getWidth();
        int oheight = srcBi.getHeight();

        Graphics2D graphics = (Graphics2D)srcBi.getGraphics();
        graphics.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_ON);
        graphics.setColor(Color.BLUE);
        int fontSize = 50;
        Font font = new Font("楷體",Font.BOLD,fontSize);
        graphics.setFont(font);

        FontDesignMetrics metrics = FontDesignMetrics.getMetrics(font);


        //畫字符串,x座標即字符串左邊位置,y座標是指baseline的y座標,即字體所在矩形的左上角y座標+ascent
        graphics.drawString(DateUtil.formatDate(new java.util.Date(),DateUtil.FULL_TRADITION_PATTERN),10,10+metrics.getAscent()); //基線對齊改成頂邊對齊

        String centerWords = "居中文字";
        int strWidth = metrics.stringWidth(centerWords);
        int strHeight = metrics.getHeight();
        int left = (owidth-strWidth)/2; //左邊位置
        int top = (oheight-strHeight)/2+metrics.getAscent(); //頂邊位置+上升距離(本來字體基線位置對準畫布的y座標致使字體偏上ascent距離,加上ascent後下移恰好頂邊吻合)
        graphics.drawString(centerWords,left,top);

效果圖api

相關文章
相關標籤/搜索