بحاجة إلى وسيلة لتوسيع نطاق خط لتتناسب مع مستطيل

StackOverflow https://stackoverflow.com/questions/876234

  •  22-08-2019
  •  | 
  •  

سؤال

ولقد كتب بعض رمز لتوسيع نطاق خط لتناسب داخل (طول) مستطيل. ويبدأ في 18 العرض وبالتكرار لأسفل حتى تناسبها.

وهذا يبدو غير فعال فظيعة، ولكن لا أستطيع أن أجد وسيلة غير حلقات للقيام بذلك. هذا الخط هو للتسميات في شبكة المباراة التي المقاييس، لذلك لا استطيع ان ارى حلا عمل حول (التفاف، وقطع وتوسيع الماضي المستطيل كلها غير مقبول).

وانها فعلا سريعة جدا، وأنا أفعل هذا لمئات من المستطيلات وانها سريعة بما يكفي لمجرد إبطاء انتشاره لمسة.

إذا لا أحد يأتي مع أي شيء أفضل، وأنا مجرد تحميل تخمين بدءا من الجدول (بحيث أنها أقرب بكثير من 18)، واستخدام هذا - باستثناء تأخر يعمل كبيرة

public Font scaleFont(String text, Rectangle rect, Graphics g, Font pFont) {
    float nextTry=18.0f;
    Font font=pFont;

    while(x > 4) {                             
            font=g.getFont().deriveFont(nextTry);
            FontMetrics fm=g.getFontMetrics(font);
            int width=fm.stringWidth(text);
            if(width <= rect.width)
                return font;
            nextTry*=.9;            
    }
    return font;
}
هل كانت مفيدة؟

المحلول

وكود شبه الزائفة:

public Font scaleFont(String text, Rectangle rect, Graphics g, Font pFont) {
    float fontSize = 20.0f;
    Font font = pFont;

    font = g.getFont().deriveFont(fontSize);
    int width = g.getFontMetrics(font).stringWidth(text);
    fontSize = (rect.width / width ) * fontSize;
    return g.getFont().deriveFont(fontSize);
}

ولست متأكدا لماذا كنت تمر في pFont كما انها لم تستخدم ...

نصائح أخرى

هل يمكن استخدام البحث الاستيفاء:

public static Font scaleFont(String text, Rectangle rect, Graphics g, Font pFont) {
    float min=0.1f;
    float max=72f;
    float size=18.0f;
    Font font=pFont;

    while(max - min <= 0.1) {
        font = g.getFont().deriveFont(size);
        FontMetrics fm = g.getFontMetrics(font);
        int width = fm.stringWidth(text);
        if (width == rect.width) {
            return font;
        } else {
            if (width < rect.width) {
                min = size;
            } else {
                max = size;
            }
            size = Math.min(max, Math.max(min, size * (float)rect.width / (float)width));
        }
    }
    return font;
}

وتغيير جميع المتغيرات العرض لتعويم بدلا من كثافة العمليات للحصول على نتيجة أفضل.

public static Font scaleFontToFit(String text, int width, Graphics g, Font pFont)
{
    float fontSize = pFont.getSize();
    float fWidth = g.getFontMetrics(pFont).stringWidth(text);
    if(fWidth <= width)
        return pFont;
    fontSize = ((float)width / fWidth) * fontSize;
    return pFont.deriveFont(fontSize);
}
private Font scaleFont ( String text, Rectangle rect, Graphics gc )
{
    final float fMinimumFont = 0.1f;
    float fMaximumFont = 1000f;

    /* Use Point2d.Float to hold ( font, width of font in pixels ) pairs. */
    Point2D.Float lowerPoint = new Point2D.Float ( fMinimumFont, getWidthInPixelsOfString ( text, fMinimumFont, gc ) );
    Point2D.Float upperPoint = new Point2D.Float ( fMaximumFont, getWidthInPixelsOfString ( text, fMaximumFont, gc ) );
    Point2D.Float midPoint = new Point2D.Float ();

    for ( int i = 0; i < 50; i++ )
    {
        float middleFont = ( lowerPoint.x + upperPoint.x ) / 2;

        midPoint.setLocation ( middleFont, getWidthInPixelsOfString ( text, middleFont, gc ) );

        if ( midPoint.y >= rect.getWidth () * .95 && midPoint.y <= rect.getWidth () )
            break;
        else if ( midPoint.y < rect.getWidth () )
            lowerPoint.setLocation ( midPoint );
        else if ( midPoint.y > rect.getWidth () )
            upperPoint.setLocation ( midPoint );
    }

    fMaximumFont = midPoint.x;

    Font font = gc.getFont ().deriveFont ( fMaximumFont );

    /* Now use Point2d.Float to hold ( font, height of font in pixels ) pairs. */
    lowerPoint.setLocation ( fMinimumFont, getHeightInPixelsOfString ( text, fMinimumFont, gc ) );
    upperPoint.setLocation ( fMaximumFont, getHeightInPixelsOfString ( text, fMaximumFont, gc ) );

    if ( upperPoint.y < rect.getHeight () )
        return font;

    for ( int i = 0; i < 50; i++ )
    {
        float middleFont = ( lowerPoint.x + upperPoint.x ) / 2;

        midPoint.setLocation ( middleFont, getHeightInPixelsOfString ( text, middleFont, gc ) );

        if ( midPoint.y >= rect.getHeight () * .95 && midPoint.y <= rect.getHeight () )
            break;
        else if ( midPoint.y < rect.getHeight () )
            lowerPoint.setLocation ( midPoint );
        else if ( midPoint.y > rect.getHeight () )
            upperPoint.setLocation ( midPoint );
    }

    fMaximumFont = midPoint.x;

    font = gc.getFont ().deriveFont ( fMaximumFont );

    return font;
}


private float getWidthInPixelsOfString ( String str, float fontSize, Graphics gc )
{
    Font font = gc.getFont ().deriveFont ( fontSize );

    return getWidthInPixelsOfString ( str, font, gc );
}

private float getWidthInPixelsOfString ( String str, Font font, Graphics gc )
{
    FontMetrics fm = gc.getFontMetrics ( font );
    int nWidthInPixelsOfCurrentFont = fm.stringWidth ( str );

    return (float) nWidthInPixelsOfCurrentFont;
}


private float getHeightInPixelsOfString ( String string, float fontSize, Graphics gc )
{
    Font font = gc.getFont ().deriveFont ( fontSize );

    return getHeightInPixelsOfString ( string, font, gc );
}

private float getHeightInPixelsOfString ( String string, Font font, Graphics gc )
{
    FontMetrics metrics = gc.getFontMetrics ( font );
    int nHeightInPixelsOfCurrentFont = (int) metrics.getStringBounds ( string, gc ).getHeight () - metrics.getDescent () - metrics.getLeading ();

    return (float) nHeightInPixelsOfCurrentFont * .75f;
}

ويمكنك تحسين كفاءة استخدام نمط البحث ثنائي - عالية / منخفضة مع بعض التفاصيل - إما 1، 0.5 أو 0.25 نقطة

وعلى سبيل المثال، تخمين في 18، مرتفعة جدا؟ الانتقال إلى 9، قليلة جدا؟ 13.5، منخفضة جدا؟ 15.75، مرتفعة جدا؟ 14!

وA مختلفة، طريقة واضحة سيكون لديك النص قبل رسمها على صورة نقطية، ومن ثم تقليص نقطية لتناسب المستطيل. ولكن، بسبب تصميم الخط اليدوية الحرفية وملمحا وما إلى ذلك، العثور على الحق في حجم الخط تنتج أفضل المظهر (على الرغم ربما ليس أسرع) نتيجة.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top