Android自定义view绘制文字位置相关操作,基线问题

---------------Paint---------------
1)Paint的基本实用方法和技巧
	(1)基本的使用
	1.1 负责图形绘制相关
	//重置
	mPaint.reset();
	mPaint.setColor(Color.RED);
	mPaint.setAlpha(255);
	//设置画笔的样式
//		mPaint.setStyle(Paint.Style.FILL);//填充内容
//		mPaint.setStyle(Paint.Style.FILL_AND_STROKE);
		mPaint.setStyle(Paint.Style.STROKE);//描边
	//画笔的宽度
		mPaint.setStrokeWidth(50);
	//线帽
//		mPaint.setStrokeCap(Paint.Cap.BUTT);//没有
		mPaint.setStrokeCap(Paint.Cap.ROUND);//圆形
//		mPaint.setStrokeCap(Paint.Cap.SQUARE);//方形
		
//		mPaint.setStrokeJoin(Paint.Join.MITER);//锐角
//		mPaint.setStrokeJoin(Paint.Join.ROUND);//圆弧
//		mPaint.setStrokeJoin(Paint.Join.BEVEL);//直线
	//线段的连接处的样式
//		mPaint.setStrokeJoin(Paint.Join.MITER);//锐角
//		mPaint.setStrokeJoin(Paint.Join.ROUND);//圆弧
//		mPaint.setStrokeJoin(Paint.Join.BEVEL);//直线

	//防锯齿,会损失一定的性能
		mPaint.setAntiAlias(true);


	1.2 负责文字绘制相关
			//-----------------2.文字绘制--------------------
		//获得字符行间距
//		mPaint.getFontSpacing();
		//获得字符之间的间距
//		mPaint.getLetterSpacing();
//		mPaint.setLetterSpacing(letterSpacing)//设置
		//设置文本删除线
//		mPaint.setStrikeThruText(true);
		//是否设置下划线
//		mPaint.setUnderlineText(true);
		//设置文本大小
//		mPaint.setTextSize(textSize);
//		mPaint.getTextSize();
//		mPaint.setTypeface(Typeface.BOLD);//设置字体类型
//		Typeface.ITALIC
//		Typeface.create(familyName, style)//加载自定义字体
		//文字倾斜 默认0,官方推荐的-0.25f是斜体
//		mPaint.setTextSkewX(-0.25f);
		//文本对齐方式
//		mPaint.setTextAlign(Align.LEFT);
//		mPaint.setTextAlign(Align.CENTER);
//		mPaint.setTextAlign(Align.RIGHT);
		//计算制定长度的字符串(字符长度、字符个数、显示的时候真实的长度)
//		int breadText = mPaint.breakText(text, measureForwards, maxWidth, measuredWidth)
		
		mPaint.setTextSize(50);
//		float[] measuredWidth = new float[1];
//		int breakText = mPaint.breakText(str, true, 200, measuredWidth);
//		Log.i("RICKY", "breakText="+breakText+", str.length()="+str.length()+", measredWidth:"+measuredWidth[0]);
		
		// Rect bounds获取文本的矩形区域(宽高)
//		mPaint.getTextBounds(text, index, count, bounds)
//		mPaint.getTextBounds(text, start, end, bounds)
		
		//获取文本的宽度,和上面类似,但是是一个比较粗略的结果
		float measureText = mPaint.measureText(str);
		//获取文本的宽度,和上面类似,但是是比较精准的。
		float[] measuredWidth = new float[10];
		
		//measuredWidth得到每一个字符的宽度;textWidths字符数
		int textWidths = mPaint.getTextWidths(str, measuredWidth);
//		mPaint.getTextWidths(text, start, end, widths)
		Log.i("RICKY", "measureText:"+measureText+", textWidths:"+textWidths);
		
		=====================基线的问题=====================

		FontMetrics fontMetrics = mPaint.getFontMetrics();
		fontMetrics.top;
		fontMetrics.ascent;
		fontMetrics.descent;
		fontMetrics.bottom;
		所有的四个值都是以基线baseLine为基准来计算的。baseline以上的就是负的;以下的是正的。

		在做自定义控件的时候canvas.drawText(x,y) 这个y并不是text的左上角,而是以baseline为基准的。

		1)实例:指定左上角的顶点坐标 绘制文本
		公式: float baselineY = Y - fontMetrics.top;

		
		2)实例:指定中间位置,绘制文本
		公式: float baselineY = centerY + (fontMetrics.bottom-fontMetrics.top)/2 - fontMetrics.bottom

猜你喜欢

转载自blog.csdn.net/yu540135101/article/details/85016469