Android 自定义View (六)

忌妒别人,不会给自己增加任何的好处,忌妒别人,也不可能减少别人的成就。


本讲内容:FontMetrics  字体测量类(有五个成员变量

注意:Paint有一个唯一的子类TextPaint文本的画笔 就是专门为文本绘制量身定做的“笔”

public static class FontMetrics {  
    public float   top;  
    public float   ascent;  
    public float   descent;  
    public float   bottom;  
    public float   leading;  
}  

在Android中,文字的绘制都是从Baseline基线处开始的,Baseline往上至字符最高处的距离我们称之为ascent(上坡度),Baseline往下至字符最底处的距离我们称之为descent(下坡度),而leading(行间距)则表示上一行字符的descent到该行字符的ascent之间的距离。因为TextView在绘制文本的时候考虑到了类似读音符号,而top的意思其实就是除了Baseline到字符顶端的距离外还应该包含这些符号的高度,bottom的意思也是一样。这就是为什么top和bottom总会比ascent和descent大一点的原因。而在TextView中我们可以通过xml设置其属性android:includeFontPadding="false"去掉一定的边距值但是不能完全去掉。

注:Baseline上方的值为负,下方的值为正

下面是自定义CustomTitleView.java文件:

public class CustomView extends View {
	private Paint mPaint;// 画笔 
	private FontMetrics mFontMetrics;// 文本测量对象

	public CustomView(Context context) {
		super(context, null);
	}

	public CustomView(Context context, AttributeSet attrs) {
		super(context, attrs);

		initPaint();
	}

	private void initPaint() {
		mPaint=new Paint(Paint.ANTI_ALIAS_FLAG);
		
		mFontMetrics=mPaint.getFontMetrics();
		System.out.println("ascent:\t"+mFontMetrics.ascent);
		System.out.println("top:\t"+mFontMetrics.top);
		System.out.println("leading:\t"+mFontMetrics.leading);
		System.out.println("descent:\t"+mFontMetrics.descent);
		System.out.println("bottom:\t"+mFontMetrics.bottom);
	}

	protected void onDraw(Canvas canvas) {
		super.onDraw(canvas);
	}

}

打印:(随着文字的大小会变化的)

 ascent:	-11.1328125
 top:	       -12.673828
 leading:	0.0    
 descent:	2.9296875
 bottom:	3.2519531
只有一行文本所以leading恒为0


一、Paint类有两个方法

ascent():  获得baseline以上的height

descent():获得baseline以下的height

所以获取文字的height和width分别是:

获取height : Math.abs(mPaint.ascent() + mPaint.descent())

获取width : mPaint.measureText(text)


示例一:文本居中画布(文字的绘制都是从Baseline基线处开始的


下面是自定义CustomTitleView.java文件:

public class CustomView extends View {
	private static final String TEXT = "world 你好!";
	private Paint textPaint, linePaint;// 文本的画笔和中心线的画笔

	private int baseX, baseY;// Baseline绘制的XY坐标

	public CustomView(Context context) {
		super(context, null);
	}

	public CustomView(Context context, AttributeSet attrs) {
		super(context, attrs);

		initPaint();
	}

	private void initPaint() {
		textPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
		textPaint.setTextSize(70);
		textPaint.setColor(Color.BLACK);

		linePaint = new Paint(Paint.ANTI_ALIAS_FLAG);
		linePaint.setStyle(Paint.Style.STROKE);
		linePaint.setStrokeWidth(1);
		linePaint.setColor(Color.RED);
	}

	protected void onDraw(Canvas canvas) {
		super.onDraw(canvas);

		// 计算Baseline绘制的起点X轴坐标
		baseX = (int) (canvas.getWidth() / 2 - textPaint.measureText(TEXT) / 2);

		// 计算Baseline绘制的Y坐标(有点难理解,记住)
		baseY = (int) ((canvas.getHeight() / 2) - ((textPaint.descent() + textPaint.ascent()) / 2));

		canvas.drawText(TEXT, baseX, baseY, textPaint);

		// 为了便于理解我们在画布中心处绘制一条中线
		canvas.drawLine(0, canvas.getHeight() / 2, canvas.getWidth(),canvas.getHeight() / 2, linePaint);
	}

}

Take your time and enjoy it

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
提供的源码资源涵盖了安卓应用、小程序、Python应用和Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值