Let's first look at what it says:
- Top The maximum distance above the baseline for the highest glyph of the font for a given text size.
- Climbing Recommended distance above baseline for selected text.
- Descent Recommended distance below the baseline for selected text at intervals.
- Bottom . The maximum distance below the baseline for the lowest glyph of the font for a given text size.
- Lead . Recommended extra space for adding lines of text.
Note that the baseline is what the first four are measured from. This is the line that forms the base on which the text sits, even if some characters (for example, g, y, j, etc.) may have parts that go below the line. This is comparable to the lines that you write in a laid out notebook .
Here is an image to help visualize these things:

Remember that when drawing on canvas in Java and Android, decreasing downward means increasing y, and increasing it means decreasing y. This means that FontMetrics' top and ascent are negative numbers, as they are measured from the baseline (while the descent and the lower ones are positive numbers). Thus, in order to get the distance from top to bottom , you will need to do ( bottom - top ).
Lead is the distance between the bottom of one line and the top of the next line. In the image above, this is the space between the orange color of line 1 and the purple line 2. Since @MajorTom is noted below , the term is more correctly defined in the printing house as "the distance between the baselines of consecutive lines of type". * However, Android seems to use the term in a more historical sense. The word (pronounced "leading") comes from a line that the old elders used to indicate type lines. Basically, it was a way to adjust line spacing. In Android, I never saw the host be anything other than 0 , and I did not see it used for anything in the source code. (Correct me if you know where it is used to calculate something.) You can change the line spacing in TextView using setLineSpacing in code or android:lineSpacingExtra and android:lineSpacingMultiplier in xml. These methods , however, do not use or change the leading ones.
Check out these links for more information:
Explore more
For a more detailed study of Font Metrics, I made a simple project.

Instead of listing all the code here. I added a project to GitHub . You can either clone the project, or copy the following files to a new project.
Will there be letters above top or below bottom ?
Not usually, but they could. The top and bottom, as I understand them, are set in font (hence, "FontMetrics"), so the font creator can make the glyph higher than what they say is upper (or lower than lower). Also, with a combination of diacritics in Unicode, this can very easily happen. Here is a pretty extreme example (taken from here ): M ̵̳̙͔̟̱͕̓̀̄̉̅ͧ̋͊͌͑́͌ͪ̒̿̀̚ a ͔̟̝͔ͥ̈́̏ͮͯ̇͆̊̒ͦͦ͘͢͜ y ̵̴̢͕̝̩̱͈͕̼̣͕̟̌͗̾ͤ̎͌̄ͣͨ͊ͬ b ̡̯̰̪̜͙̟̝̠͚̜̥̙̤̃ͨ̋̒̒̊ͧͤ͐̓͋̌̾̇̔̈́̀́͡͠ e ̵ͯͪ̿̿̂̄ͫ̃҉͏͎̣̹̱̜͉̦̞̪̘̠̝̝͍̼̜̖̥̭͟ ̣̞͙͚̝̰̞̹̗̲̣͙͍͍̀̓͊̂̋ͣ̏̑̍̊͌ͩ͐̎̀ͣͣ̚͟ͅ h ̛͋̏̍̆ͤ͛͐ͨ̌̋ͤ̎̂ͨ̂̓̑̚̕͟͏̻̣͖̖͚͚͓̲̼̪ ȁ ̔̅̿͐̑͡͏̝͓̮͚̘̦̰͚͎͔͉͚̮̠̕͜ͅ ṱ ̱̼̖̓̂ͭ̏̅͂ͥ͌ͯ͌͠ s ͪ̓ͪ̄̌̓ͧ͋͐ͬ̅̑҉̨̪̬͎͍̥̬? ̡̮̳͙͓͔̹̘̹͓̘̻̦̣͎̫̐ͤ̐͛́͝ ̧̦̼̘͕̪̠̙͖̦̯̦̘͉͈͕͔̘̻̲͑ͨ̊̈́̐ͫ͐̌ͯ̀͘͝ Ḩ ̷̸̸̹͉̩̜̹̞ͯ̃̃ͧͬͨ̌̀̾̐̈̇ͧ͛̃͐̀ͦ͞ A ̴̦̗̬̠͙̭͉̟̺͇̭̰͔͕̯̅̃͋ͪ̈́̉̓̌ͯ̈́͆̋̀ͤ̇̂̿̈́̂͡͡ Ṱ ̲͎͉̣̳̺̱̜̦̬͕̣͉͇͊̌ͥ͐͒̈́̓́ͥ́̋͂̅ͬ̆͗ͥ̕͢͡ S ̍ͧ͗̒͗̂̈ͬ͊̚̚͢͏̗̣̳ͅ! ̶̨̡͇͚̙͚̭̱̣̲̳̤̞̫̗̣̦̮̖̞͒͆̿̄͑̃̎͡
By connecting this line to Android, we get the following:

Diacritical marks above top and below bottom . It is interesting to note that the total width and height are correctly measured by text boundaries.
In any case, for all practical purposes in your programming, you can simply assume that max and min for the letters of the glyph top and bottom . And usually they will remain within ascent and decent . If for any reason you need to know if the letters exceed top or bottom , you can use TextPaint.getTextBounds .