`
sd4886656
  • 浏览: 90129 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

[Android]Android字体高度的研究

 
阅读更多

android自定义View绘制的时候,会有很多情况下要与字体打交道,涉及到字体宽度、高度的时候要特别注意一下几个概念,见图:

 

 

 

baseLine:一行文字的底线。

Ascent: 字符顶部到baseLine的距离。

Descent: 字符底部到baseLine的距离。

Leading: 字符行间距。

 

 

public class TestOnDraw extends Activity {

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		// TODO Auto-generated method stub
		super.onCreate(savedInstanceState);
		MyView v = new MyView(this);
		this.setContentView(v);
	}
}

class MyView extends View
{

	public MyView(Context context) {
		super(context);
	}
	@Override
	protected void onDraw(Canvas canvas) {
		super.onDraw(canvas);
		
		Paint p = new Paint();
		p.setColor(Color.WHITE);
		p.setTextSize(50);
		p.setAntiAlias(true);
		FontMetrics fm = p.getFontMetrics();
		
		System.out.println("top = "+ fm.top);
		System.out.println("ascent = "+ fm.ascent);
		System.out.println("descent = "+ fm.descent);
		System.out.println("bottom = "+ fm.bottom);
		System.out.println("leading = "+ fm.leading);
		
        int textHeight = (int) (Math.ceil(fm.descent - fm.ascent) + 2);
        System.out.println("textHeight = "  + textHeight);
        
        float width =500;
        float baseline = 100f;
        float offsetAscent = baseline + fm.ascent;
        float offsetDescent = baseline +fm.descent;
        float offsetTop = baseline + fm.top;
        float offsetBottom = baseline + fm.bottom;
        
        canvas.drawText("中国 bp Android", 0, baseline, p);
		
		canvas.drawLine(0, baseline, width, baseline, p);//baseline
		canvas.drawLine(0, offsetAscent, width, offsetAscent, p);//ascent
		canvas.drawLine(0, offsetDescent, width, offsetDescent, p);//descent
		canvas.drawLine(0, offsetTop, width, offsetTop, p);//top
		canvas.drawLine(0, offsetBotton, width, offsetBottom, p);//bottom
	}
}
 

运行效果:


 

 

这是程序的输出结果:


 

得出结论: canvas drawText() 的startX是从左下角的baseline的底线开始绘画的,如果我们要得到字体的高度需要关注descent - ascent (ascent线在baseline上面,所以是负数)

  • 大小: 5.2 KB
  • 大小: 18 KB
  • 大小: 15.5 KB
分享到:
评论
2 楼 zoroday 2012-09-12  
int textHeight = (int) (Math.ceil(fm.descent - fm.ascent) + 2); 

为什么文本高还要再加上一个 2
1 楼 soxunyi 2012-06-14  

相关推荐

    android设置TextView中不同的文字字体大小且垂直居中显示

    SpannableString是Android SDK提供的一种可操作字符串对象,允许我们在字符串的不同部分应用不同的格式,如颜色、字体大小、样式等。 首先,我们需要了解TextView的基本属性。TextView是Android UI布局中的一个基本...

    AndroidStudio常用字体备份

    在Android开发环境中,Android Studio是官方推荐的集成开发环境(IDE),它提供了丰富的功能和高度的自定义性,包括字体的调整。这篇“AndroidStudio常用字体备份”涉及到的是开发者们在工作中经常使用的几种代码...

    Android字体宽高的获取

    我们可以利用`Paint.getFontMetrics()`得到一个`FontMetrics`对象,从中获取字体高度信息。 ```java Paint paint = new Paint(); paint.setTypeface(Typeface.DEFAULT); paint.setTextSize(14); FontMetrics ...

    Android屏幕字体适配源码

    在Android开发中,屏幕适配和字体适配是至关重要的环节,尤其是在面对各种不同尺寸、分辨率的设备时。本文将详细解析"Android屏幕字体适配源码",旨在帮助初学者理解和掌握这一关键技术。 首先,Android系统允许...

    Android中正确使用字体图标(iconfont)的方法

    可以高度自定义图标的样式(包括大小和颜色),对于个人开发者尤其适用  2. 可以减少项目和安装包的大小(特别你的项目中有很多图片icon时,效果将是M级)  3. 几乎可以忽略屏幕大小和分辨率,做到更好的适配 ...

    android 插件式无刷新换肤和字体大小切换 兼容android 8.1

    3. **布局适配**:对于布局宽度固定且内容可能因字体大小变化而溢出的情况,需要考虑动态调整布局宽度或高度。 在**兼容Android 8.1**方面,需要注意以下几点: 1. **Android Oreo权限管理**:Android 8.1加强了...

    Android DatePicker,NumPicker解析(分割线颜色及调整大小)

    在Android开发中,`DatePicker`和`NumPicker`是两种常用的UI组件,它们分别用于日期选择和数值选择。本文将详细解析如何自定义`DatePicker`的分割线颜色以及调整`NumPicker`的大小,帮助开发者打造更加个性化和美观...

    Android 多点缩放字体DEMO .zip

    【Android 多点缩放字体DEMO】 ...同时,它还展示了如何在Android环境中实现高效的图形和触摸交互,这对于创建高度定制的用户界面至关重要。理解并应用这些知识点,将有助于提升Android应用的用户体验和可访问性。

    Android实现自定义标题栏的高度化自定义

    本文将深入探讨如何在Android中实现高度化的自定义标题栏。 首先,我们需要了解Android系统默认提供的标题栏——ActionBar和Toolbar。ActionBar是早期Android版本中的标题栏组件,而Toolbar是自Android 5.0...

    Android-可实现三级联动的选择器高仿iOS的滚轮控件字体大小自适应

    在本案例中,我们讨论的是一个名为"Android-可实现三级联动的选择器高仿iOS的滚轮控件字体大小自适应"的项目,它旨在提供一种高度定制的滚轮视图,同时能够自动调整字体大小以适应不同的屏幕尺寸和内容。 首先,这...

    Android-TapeHencoder高度自定义刻度尺HenCoder仿写系列

    在Android开发中,有时我们需要创建具有特定视觉效果的自定义组件,以满足应用程序的独特设计需求。...通过研究并理解这个项目,开发者不仅能学到自定义View的原理,还能提升对Android图形绘制和用户交互处理的理解。

    android NumberPicker修改选中内容的颜色等

    // 设置分割线高度,dpToPx为转换方法 } catch (Exception e) { e.printStackTrace(); } ``` 在上述代码中,`R.drawable.custom_selection_divider` 应该是你自定义的滚动条图片资源。 此外,你还可以修改`...

    TextView的xml属性(Android)

    在Android开发中,`TextView`是用于展示文本的视图组件,它提供了丰富的特性来定制文本的显示方式。本文将详细介绍`TextView`的一些关键XML属性,帮助开发者更好地理解和使用这个组件。 1. `android:autoLink` `...

    Android实现在TextView文字过长时省略部分或滚动显示的方法

    在Android开发中,TextView是用于显示单行或多行文本的常用控件。然而,当文本内容过长时,为了适应屏幕大小,我们需要采取措施来处理这些超长的文本。本篇将详细介绍如何在TextView中实现文字过长时的省略显示和...

    Android-CalendarView一个高度可自定义的Android日历库由RecyclerView提供支持

    【Android-CalendarView】是一个专为Android平台设计的高度可自定义的日历库,它利用了强大的RecyclerView组件来实现高效、灵活的布局管理。这个库旨在为开发者提供更多的控制权,以便在应用程序中创建符合特定需求...

    详解android 中文字体向上偏移解决方案

    解决 Android 中文字体向上偏移问题的方案 在 Android 平台上,中文文字的向上偏移问题是一个常见的问题,这个问题会导致文字的显示位置不正确,从而影响到用户体验。解决这个问题需要从多方面入手,包括字体文件的...

    Android-androidUI适配屏幕适配

    7. **使用百分比布局(PercentFrameLayout/PercentRelativeLayout)**:Google推出的百分比布局库允许开发者用百分比来指定视图的宽度和高度。 8. **使用FlexboxLayout**:FlexboxLayout模仿了Web开发中的Flexbox...

    android 字体竖排

    通过这种方式,我们成功地实现了Android应用中的字体竖排效果。这个自定义控件可以应用于各种需要竖向显示文本的场景,如古诗展示、菜单栏等。在实际开发中,还可以根据需求进一步优化,例如添加对不同文字方向的...

    Android-androidalbum图片选择库

    "Android-androidalbum图片选择库"就是一个专为Android开发者设计的工具,它提供了丰富的功能和高度的定制性,帮助开发者轻松实现用户界面的个性化设置以及图片处理的需求。 该库的核心特性包括: 1. **自定义UI**...

Global site tag (gtag.js) - Google Analytics