吕晴阳

能力达不到野心时,静下心来学习


  • 首页

  • 归档

  • 标签

  • 分类

  • 关于

  • 搜索

Android Canvas的drawText()和文字居中方案

发表于 2017-10-27 | 分类于 Android | 阅读次数:

自定义View是绘制文本有三类方法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
// 第一类
public void drawText (String text, float x, float y, Paint paint)
public void drawText (String text, int start, int end, float x, float y, Paint paint)
public void drawText (CharSequence text, int start, int end, float x, float y, Paint paint)
public void drawText (char[] text, int index, int count, float x, float y, Paint paint)
<!--more-->
// 第二类
public void drawPosText (String text, float[] pos, Paint paint)
public void drawPosText (char[] text, int index, int count, float[] pos, Paint paint)
// 第三类
public void drawTextOnPath (String text, Path path, float hOffset, float vOffset, Paint paint)
public void drawTextOnPath (char[] text, int index, int count, Path path, float hOffset, float vOffset, Paint paint)

其中drawText()最常用,drawPosText ()是根据一个个坐标点指定文字位置,drawTextOnPath ()是根据路径绘制。但drawText()的x,y参数是干嘛的呢?

先来测试下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
Paint paint=new Paint();
paint.setStyle(Paint.Style.FILL);
paint.setStrokeWidth(12);
paint.setTextSize(100);
String text="测试:my text";
canvas.drawText(text, 200, 400, paint);
//画两条线标记位置
paint.setStrokeWidth(4);
paint.setColor(Color.RED);
canvas.drawLine(0, 400, 2000, 400, paint);
paint.setColor(Color.BLUE);
canvas.drawLine(200, 0, 200, 2000, paint);

左对齐-left

可以看到,x,y并不是指定文字的中点位置,并且x,y与文字对齐方式有关(通过setTextAlign()指定,默认为left)

居中对齐-center

右对齐-right

(为了使文字完整,上面调整了下x,y的值)

从上面三种情况得出结论,x所对应的竖线:

  • 左对齐 — 文字的左边界
  • 居中对齐 — 文字的中心位置
  • 右对齐 — 文字的左边界

y对应的横线并不是文字的下边界,而是基准线Baseline

看下面这张图

红色的Baseline是基准线,紫色的Top是文字的最顶部,也就是在drawText()中指定的x所对应,橙色的Bottom是文字的底部。
拿这些值如何获取呢?

1
2
3
4
5
Paint.FontMetrics fontMetrics=paint.getFontMetrics();
fontMetrics.top
fontMetrics.ascent
fontMetrics.descent
fontMetrics.bottom

记得要在设置完Paint的文字大小,宽度之类属性后再获取FontMetrics,
baseline对应对应值为0,在它下面的descent和bottom值为正,top和ascent为负。那文字的高度为bottom - top

所以,实际绘制的时候取决于基线上一个点来绘制文字,而这个点有三种分别对应为left,center,right

好啦,把drawText()中x,y参数讲清楚后实现文字居中就很容易了
直接上代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
//矩形背景
Paint bgRect=new Paint();
bgRect.setStyle(Paint.Style.FILL);
bgRect.setColor(Color.YELLOW);
RectF rectF=new RectF(200, 200, 800, 600);
canvas.drawRect(rectF, bgRect);
Paint textPaint=new Paint();
textPaint.setStyle(Paint.Style.FILL);
textPaint.setStrokeWidth(8);
textPaint.setTextSize(50);
textPaint.setTextAlign(Paint.Align.CENTER);
String text="测试:my text";
//计算baseline
Paint.FontMetrics fontMetrics=textPaint.getFontMetrics();
float distance=(fontMetrics.bottom - fontMetrics.top)/2 - fontMetrics.bottom;
float baseline=rectF.centerY()+distance;
canvas.drawText(text, rectF.centerX(), baseline, textPaint);

效果

将对齐方式设置为center,那要让文字居中显示,x值就为矩形中心x值,y值也就是baseline的计算看下图

y = 矩形中心y值 + 矩形中心与基线的距离

1
2
距离 = 文字高度的一半 - 基线到文字底部的距离(也就是bottom)
= (fontMetrics.bottom - fontMetrics.top)/2 - fontMetrics.bottom

Java反射机制

发表于 2017-10-27 | 分类于 Java | 阅读次数:

一、 反射概述

1.1 反射机制定义

Java反射机制是在运行状态中,对于任意一个类,都能够知道这个类中的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。

1.2 反射机制的功能

  • 在运行时判断任意一个对象所属的类。
  • 在运行时构造任意一个类的对象。
  • 在运行时判断任意一个类所具有的成员变量和方法。
  • 在运行时调用任意一个对象的方法。
  • 生成动态代理。
阅读全文 »

你要了解的Android Studio 3.0新特新

发表于 2017-10-27 | 分类于 Android | 阅读次数:

Android Studio 3.0稳定版刚发布,它相对于2.3版本有较大的优化和新功能,变得更加强大。那来看看都有哪些:

(还没更新的去官网https://developer.android.google.cn/studio/index.html下载更新)

Android Plugin for Gradle 3.0.0

1. 升级插件

在build.gradle文件中更改

阅读全文 »

View基础

发表于 2017-10-24 | 分类于 Android | 阅读次数:

View的位置参数

阅读全文 »

Android Picture详解

发表于 2017-10-22 | 分类于 Android | 阅读次数:

Picture是自定义view中一个实用的工具,对应Canvas中的drawPicture方法,当然除了这个外还有另外两个方法用于绘制Picture:

  • Picture自身的draw(Canvas canvas)
  • PictureDrawable的draw(Canvas canvas)

下面会讨论三种方式的不同之处,首先来看下Picture的用途和主要方法

阅读全文 »

WiFi开发(一)--WiFi开关与状态监听

发表于 2017-10-22 | 分类于 Android | 阅读次数:

之前开发了一个WiFi,热点相关的应用。因为对这方面也不熟悉,刚开始找资料看书,但看明白实现时,发现随着android版本更新,相关api有较大改动,之前的代码不能用。经过一番探索,最后实现出来了,现在把它记录下来,希望能给需要的人一些帮助。

首先来讲WiFi开发相关,那第一步肯定是如何来控制WiFi打开关闭状态,以及如何来监听其状态变化。

WiFi连接控制类–WiFiManager

阅读全文 »

Android获取调试版及发布版安全码SHA1

发表于 2017-10-13 | 分类于 Android | 阅读次数:

签名文件

签名文件keystore一般有两种:jks后缀或者keystore后缀,Android Studio中创建的为jks后缀,keytool创建的为keystore后缀,两种文件均可用于APP打包。

开发版SHA1:是指在开发调试时,从Android Studio或者Eclipse中直接运行的APP在打包时使用了开发工具默认的开发版(debug)签名文件,开发版签名文件对应有唯一的SHA1。

发布版SHA1:是指在提交测试或发布时,APP签名打包过程中选择的指定签名文件,一般此签名文件为开发者或者开发团队持有,与具体的开发工具无关,发布版签名文件同样也对应有唯一的SHA1。

阅读全文 »

Android平台MQTT使用并实现简单聊天室

发表于 2017-10-11 | 分类于 Android | 阅读次数:

在上一篇文章介绍了MQTT的原理以及其在NodeMCU上运用实现一些简单的物联网
http://www.jianshu.com/p/701f4d31029f
但没讲Android APP怎么实现的,那这篇将介绍MQTT协议在Android平台的运用,除了可以用来控制智能硬件,还常实现消息推送和即时通讯im。下面的例子用它来实现一个简单的聊天室

阅读全文 »

FragmentTabHost的使用和注意事项

发表于 2017-10-07 | 分类于 Android | 阅读次数:

一般做tab式界面我都是用的BottomNavigationView+Fragment,自己代码控制各fragment的显示和隐藏,这样做代码要多些,如果控制不当可能会在用户重返app时出现fragment重合现象。那偷懒一些的做法可以使用FragmentTabHost+Fragment来实现,只用添加相应Tab就可以,方便很多。

先看实现的效果:

阅读全文 »

一步一步来,记全Github命令和用法

发表于 2017-09-15 | 分类于 Android | 阅读次数:

SSH key配置

为了在使用github过程中重复输入用户名,密码,通常需要配置生成ssh key,并把它添加到github上,使得远程命令时github能识别我们的机器,并直接给与授权。
首先在本机生成一个ssh key

1
ssh-keygen -t rsa -b 4096 -C "XXXX@example.com" #邮箱用github注册时的邮箱

阅读全文 »
12
吕晴阳

吕晴阳

走过的人说树枝长了,走过的人说树枝在长

16 日志
3 分类
21 标签
RSS
Github Email Jianshu Facebook
© 2017 吕晴阳
由 Hexo 强力驱动
|
主题 — NexT.Gemini v5.1.2