Is there an easy way to align text to the right and center (instead of default left)?
            Asked
            
        
        
            Active
            
        
            Viewed 1.8k times
        
    3 Answers
21
            
            
        I use this code:
 [Flags]
 public enum Alignment { Center=0, Left=1, Right=2, Top=4, Bottom = 8 }
 public void DrawString(SpriteFont font, string text, Rectangle bounds, Alignment align, Color color )
    {
        Vector2 size = font.MeasureString( text );
        Vector2 pos = bounds.GetCenter( );
        Vector2 origin = size*0.5f;
        if ( align.HasFlag( Alignment.Left ) )
            origin.X += bounds.Width/2 - size.X/2;
        if ( align.HasFlag( Alignment.Right ) )
            origin.X -= bounds.Width/2 - size.X/2;
        if ( align.HasFlag( Alignment.Top ) )
            origin.Y += bounds.Height/2 - size.Y/2;
        if ( align.HasFlag( Alignment.Bottom ) )
            origin.Y -= bounds.Height/2 - size.Y/2;
        DrawString( font, text, pos, color, 0, origin, 1, SpriteEffects.None, 0 );
    }
 
    
    
        Blau
        
- 5,742
- 1
- 18
- 27
- 
                    That does not work for multiline text – duesterdust Nov 18 '21 at 10:06
- 
                    No, it's not intended to do so – Blau Nov 19 '21 at 14:07
19
            The first step is to measure the string using SpriteFont.MeasureString().
Then, for example if you want to draw it to the left of a certain point, instead of to the right as is the default, then you need to subtract the X width of the measurement from the text drawing origin. If you want it to be centered, then you can use half the measurement, etc.
 
    
    
        Kendall Frey
        
- 43,130
- 20
- 110
- 148
-3
            
            
        SpriteFont mFont;
SpriteBatch mSprite;
mSprite.Begin();
mSprite.DrawString(mFont, "YourText", new Vector2(graphicsDevice.Viewport.Width / 2 - mFont.MeasureString("YourText").Length() / 2, 0), Color.White, 0, new Vector2(0, 0), 1f, SpriteEffects.None, 0f);
mSprite.End();
 
    