zoukankan      html  css  js  c++  java
  • java绘图drawString位置的确定

    根据api,很容易知道使用方式如下:

    指定字符串和坐标即可。

    但是简单认为字符串的起始位置就是左上顶点就错了,这样画起来每次的位置都不对,字体的大小不同,位置偏差很大。仔细看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);

    效果图

  • 相关阅读:
    Android 面试题--Activity
    Android 手机卫士--平移动画实现
    Android 手机卫士--导航界面4的业务逻辑
    Android 手机卫士--获取联系人信息并显示与回显
    Android 手机卫士--绑定sim卡序列号
    Android 手机卫士--导航界面3、4和功能列表界面跳转逻辑处理
    Android 手机卫士--导航界面2
    Android 手机卫士--9patch图
    Add Columns to the Web Sessions List
    C# System.Collections.Generic.Dictionary
  • 原文地址:https://www.cnblogs.com/hdwang/p/10157419.html
Copyright © 2011-2022 走看看