Android: TextView 及其子类通过代码和 XML 设置字体大小的存在差异的分析
原因: 在代码中通过 setTextSize(float size) 设置,使用的是 sp 为默认单位。 而 XML 中使用了 px,所以需要使用先把做好 sp 和 px 的转换工作。
最近在做 app 内修改字体大小,同时在设置页面有个预览界面,这个时候需要通过代码设置字体大小了
tv.setTextSize(getResources().getDimension(R.dimen.XLargeTextSize));
结果发现比通过 XML 设置的字体大小要大不少,看到了 setTextSize() 的源码,发现了问题所在。
1. setTextSize(), 该方法调用的是 setTextSize(TypedValue.COMPLEX_UNIT_SP, size),看到了使用了一个尺寸单位 TypedValue.COMPLEX_UNIT_SP
@android.view.RemotableViewMethod
public void setTextSize(float size) {
setTextSize(TypedValue.COMPLEX_UNIT_SP, size);
}
跟进到 TypedValue 中,查看到常量,根据输入不同的单位,解析不同的 size,然后确定文字大小
查看到有三个常量:(px, dip(dp), sp)
/** {@link #TYPE_DIMENSION} complex unit: Value is raw pixels. */
public static final int COMPLEX_UNIT_PX = 0;
/** {@link #TYPE_DIMENSION} complex unit: Value is Device Independent
* Pixels. */
public static final int COMPLEX_UNIT_DIP = 1;
/** {@link #TYPE_DIMENSION} complex unit: Value is a scaled pixel. */
public static final int COMPLEX_UNIT_SP = 2;
2. setTextSize(int unit, float size),在这个方法中,解析了 TypedValue 中的常量,解析方法为 applyDimension()
public void setTextSize(int unit, float size) {
Context c = getContext();
Resources r; if (c == null)
r = Resources.getSystem();
else
r = c.getResources(); setRawTextSize(TypedValue.applyDimension(
unit, size, r.getDisplayMetrics()));
}
3. TypedValue.applyDomension(),根据不同的单位,返回不同的 value。 1. 选择 px 为单位,直接返回输入的 value; 2. 选择 dp 为单位 ,返回为 value * density;3. 选择 sp 为单位,返回 value* scaledDensity
public static float applyDimension(int unit, float value,
DisplayMetrics metrics)
{
switch (unit) {
case COMPLEX_UNIT_PX:
return value;
case COMPLEX_UNIT_DIP:
return value * metrics.density;
case COMPLEX_UNIT_SP:
return value * metrics.scaledDensity;
case COMPLEX_UNIT_PT:
return value * metrics.xdpi * (1.0f/72);
case COMPLEX_UNIT_IN:
return value * metrics.xdpi;
case COMPLEX_UNIT_MM:
return value * metrics.xdpi * (1.0f/25.4f);
}
return 0;
}
4. setRawTextSize(),这个方法中,调用了 mTextPaint.setTextSize(), mTextPaint 是 TextPaint 的实例, TextPaint 继承 Paint,可以看到就是调用的 Paint 的 setTextSize() 方法。
private void setRawTextSize(float size) {
if (size != mTextPaint.getTextSize()) {
mTextPaint.setTextSize(size); if (mLayout != null) {
nullLayouts();
requestLayout();
invalidate();
}
}
}
Android: TextView 及其子类通过代码和 XML 设置字体大小的存在差异的分析的更多相关文章
- Android代码中设置字体大小,字体颜色,显示两种颜色.倒计时效果
Android代码中设置字体大小,字体颜色,显示两种颜色 在xml文件中字体大小用的像素 <TextView android:id="@+id/uppaid_time" an ...
- android TextView 设置字体大小
package com.example.yanlei.yl4; import android.graphics.Color;import android.os.Bundle;import androi ...
- Android Studio升级到0.8.1后怎样设置字体大小?
升级到0.8.1后.打开设置字体大小页面.你会发现无论是Default还是Darcula,都不同意你改变字体的大小.事实上这个是由于这两个模式是Android Studio自带模式,所以不同意你修改, ...
- Android textview及其子类
属性: android:autoLink设置是否当文本为URL链接/email/电话号码/map时,文本显示为可点击的链接.可选值(none/web/email/phone/map/all) andr ...
- eclipse中android开发怎么修改xml文件字体大小
windows->preference->General->appearence->Colors and Font->Basic->Text Font.点击右侧的E ...
- 更改MyEclipse 之 jsp、js、java、xml文件字体大小设置
1.打开eclipse->window-->prefercess--->general--->appearance-->color and font ----> B ...
- android studio 更改背景和设置字体大小
1,设置字体大小 2,设置背景主题
- android textview改变部分文字的颜色和string.xml中文字的替换(转)
转 :http://blog.csdn.net/ljz2009y/article/details/23878669 一:TextView组件改变部分文字的颜色: TextView textView ...
- Android TextView使用HTML处理字体样式、显示图片等
一般情况下,TextView中的文本都是一个样式.那么如何对于TextView中各个部分的文本来设置字体,大小,颜色,样式,以及超级链接等属性呢?下面我们通过SpannableString的具体实例操 ...
随机推荐
- ROS中利用V-rep进行地图构建仿真
V-rep中显示激光扫描点 在VREP自带的场景中找到practicalPathPlanningDemo.ttt文件,删除场景中多余的物体只保留静态的地图.然后在Model browser→comp ...
- 转 PHP5+APACHE2.2配置
初学php,配置起来老出问题,找了篇不错的帖子,一试就通过了,所以就顺带着转了过来. 不过在我安装phpMyAdmin的时候还是发现这篇文章的一个问题,就是php.ini如果放在system32下,启 ...
- MongoDB安装实录
mongodb是nosql中的贵族,很受欢迎... 01.下载 官方:https://www.mongodb.com 社区版.企业版 https://www.mongodb.com/downloa ...
- 生命周期方法调用,以及在onStop()方法中处理草稿信息
生命周期方法调用顺序 1. 从会话列表界面跳转到信息列表界面. 07-17 17:29:18.718: I/txrjsms(19370): MessageListActivity.onCreate 0 ...
- MyEclipse 2014安装properties文件插件
安装步骤 1.下载PropertiesEditor插件 http://propedit.sourceforge.jp/index_en.html2.解压出features.plugins文件3.在My ...
- [POST] What Is the Linux fstab File, and How Does It Work?
If you’re running Linux, then it’s likely that you’ve needed to change some options for your file sy ...
- spdk 编译动态库( spdk compiles shared library )
1,dpdk编译共享库 默认情况下都编译出静态库,如果想编译出动态库,把config/common_base文件中的CONFIG_RTE_BUILD_SHARED_LIB改成y即可. 2,spdk编译 ...
- JavaScript 错误处理, Throw、Try 和 Catch入门
try 语句测试代码块的错误. catch 语句处理错误. throw 语句创建自定义错误. 错误一定会发生 当 JavaScript 引擎执行 JavaScript 代码时,会发生各种错误: 可能是 ...
- kafka负载均衡相关资料收集(三)
apache kafka系列之Producer处理逻辑 下文是转载的,原文链接地址:点这儿 [转] Kafka ProducerKafka Producer处理逻辑kafka生产者处理逻辑apache ...
- 用ElasticSearch存储日志
介绍 如果你使用elasticsearch来存储你的日志,本文给你提供一些做法和建议. 如果你想从多台主机向elasticsearch汇集日志,你有以下多种选择: Graylog2 安装在一台中心机上 ...