下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
【移动应用开发技术】怎么在Android中动态设置字体大小
本篇文章为大家展示了怎么在Android中动态设置字体大小,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。在java代码中取在dimens.xml中定义的值一共有三种:getDimension()getDimensionPixelOffset()getDimensionPixelSize()getDimension()
/**
*
Retrieve
a
dimensional
for
a
particular
resource
ID.
Unit
*
conversions
are
based
on
the
current
{@link
DisplayMetrics}
associated
*
with
the
resources.
*
*
@param
id
The
desired
resource
identifier,
as
generated
by
the
aapt
*
tool.
This
integer
encodes
the
package,
type,
and
resource
*
entry.
The
value
0
is
an
invalid
identifier.
*
*
@return
Resource
dimension
value
multiplied
by
the
appropriate
*
metric.
*/
public
float
getDimension(@DimenRes
int
id)
throws
NotFoundException
{
}通过注释我们不难发现,getDimension()是根据指定id获取一个基于当前DisplayMetrics的值。这个值究竟是什么也没有说,只知道是float,并且单位转换是基于当前资源的,但肯定不是像素,如果是像素应该是int。getDimensionPixelSize
/**
*
Retrieve
a
dimensional
for
a
particular
resource
ID
for
use
*
as
a
size
in
raw
pixels.
This
is
the
same
as
*
{@link
#getDimension},
except
the
returned
value
is
converted
to
*
integer
pixels
for
use
as
a
size.
A
size
conversion
involves
*
rounding
the
base
value,
and
ensuring
that
a
non-zero
base
value
*
is
at
least
one
pixel
in
size.
*
*
@param
id
The
desired
resource
identifier,
as
generated
by
the
aapt
*
tool.
This
integer
encodes
the
package,
type,
and
resource
*
entry.
The
value
0
is
an
invalid
identifier.
*
*
@return
Resource
dimension
value
multiplied
by
the
appropriate
*
metric
and
truncated
to
integer
pixels.
*/
public
int
getDimensionPixelSize(@DimenRes
int
id)
throws
NotFoundException
{
}getDimensionPixelSize()的功能与getDimension()类似,不同的是将结果转换为int,并且小数部分四舍五入,这个结果将作为尺寸。getDimensionPixelSize()进行了尺寸转换,这个转换实际是上四舍五入的结果,并且保证返回值是一个至少是1像素的非零数值。getDimensionPixelOffset()
/**
*
Retrieve
a
dimensional
for
a
particular
resource
ID
for
use
*
as
an
offset
in
raw
pixels.
This
is
the
same
as
*
{@link
#getDimension},
except
the
returned
value
is
converted
to
*
integer
pixels
for
you.
An
offset
conversion
involves
simply
*
truncating
the
base
value
to
an
integer.
*
*
@param
id
The
desired
resource
identifier,
as
generated
by
the
aapt
*
tool.
This
integer
encodes
the
package,
type,
and
resource
*
entry.
The
value
0
is
an
invalid
identifier.
*
*
@return
Resource
dimension
value
multiplied
by
the
appropriate
*
metric
and
truncated
to
integer
pixels.
*/
public
int
getDimensionPixelOffset(@DimenRes
int
id)
throws
NotFoundException
{
}getDimensionPixelOffset()与getDimension()功能类似,不同的是将结果转换为int,这个结果将用作原始像素的偏移量。偏移转换(offsetconversion,函数命名中的offset是这个意思)的作用之一是将基础值简单地截短为整数,注意直接截断小数位,即取整(其实就是把float强制转化为int,注意不是四舍五入)。阶段性总结由此可见,这三个函数返回的都是绝对尺寸,而不是相对尺寸(dp\sp等)。如果getDimension()返回结果是30.5f,那么getDimensionPixelSize()返回结果就是31,getDimensionPixelOffset()返回结果就是30。至此,应该说getDimensionPixelSize()getDimension()getDimensionPixelOffset()我们已经大致有所了解了,但是如果想更深入了解一下,就需要深入源码以验证上述解释。扒源码深入源码,我们可以发现其实这三个函数的实现大同小异,以getDimension()为例:
public
float
getDimension(@DimenRes
int
id)
throws
NotFoundException
{
final
TypedValue
value
=
obtainTempTypedValue();
try
{
final
ResourcesImpl
impl
=
mResourcesImpl;
impl.getValue(id,
value,
true);
if
(value.type
==
TypedValue.TYPE_DIMENSION)
{
return
TypedVplexToDimension(value.data,
impl.getDisplayMetrics());
}
throw
new
NotFoundException("Resource
ID
#0x"
+
Integer.toHexString(id)
+
"
type
#0x"
+
Integer.toHexString(value.type)
+
"
is
not
valid");
}
finally
{
releaseTempTypedValue(value);
}
}类TypedValue是动态类型数据的容器,其主要用于盛放Resources的值。上述代码第7行就是根据id获取TypedValue的值,getDimension()、getDimensionPixelOffset()和getDimensionPixelSize()函数体唯一的不同就是第7行:getDimension()调用的是TypedValue的complexToDimension()方法getDimensionPixelSize调用的是TypedValue的complexToDimensionPixelSize()方法getDimensionPixelOffset调用的是TypedValue的complexToDimensionPixelOffset()方法顺藤摸瓜,我们继续深入ypedValue,查看complexToDimension()、complexToDimensionPixelSize()和complexToDimensionPixelOffset()函数的区别,会发现这三个函数体内容依旧大同小异,以complexToDimension()为例:
public
static
float
complexToDimension(int
data,
DisplayMetrics
metrics)
{
return
applyDimension(
(data>>COMPLEX_UNIT_SHIFT)&COMPLEX_UNIT_MASK,
complexToFloat(data),
metrics);
}complexToDimensionPixelOffset()与complexToDimension()不同的是将结果进行了强转,实际上相当直接截断小数部分;complexToDimensionPixelSize()是将结果进行四舍五入,并取整。这里的四舍五入实际上就是把结果加上0.5f然后进行强转。applyDimension()各位看官,源码已经看到了这里,是否已感觉很无趣?但applyDimension()的实现已经脱光了在等着你呢: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;
}在上述代码中,我们发现在applyDimension()中根据单位的不同,将float乘上不同的系数。如dip/dp需乘上屏幕系数,sp则需乘上字号的缩放系数,pt、in、mm等也是根据相应的算法进行换算(从COMPLEX_UNIT_PX直接返回float可以看出,该方法是将数值转成像素数)。再次总结通过上述探索,我们不难发现,在Adroid并没有在java代码中直接获取dimens.xml中定义的dp(dip)/sp的值的API,只有getDimension()、getDimensionPixelOffset()和getDimensionPixelSize()这个三个方法来获取绝对尺寸。但有时候我们确实需要动态获取dimen.xml中的值,并为TextView设置字体大小。而这种方法直接应用在textView.setTextSize(dimen);都是有问题的。那我们将从TextView入手,寻找一个正确的姿势来设置字体大小。setTextSize()首先把代码端上来:
public
void
setTextSize(float
size)
{
setTextSize(TypedValue.COMPLEX_UNIT_SP,
size);
}原来setTextSize(float)调用了他的重载方法setTextSize(int,float),并且第一个参数传的默认值是TypedValue.COMPLEX_UNIT_SP,眼熟吗,没错就是之前提到的。那么,我们继续看看一下setTextSize(int,float)做了什么:
public
void
setTextSize(int
unit,
float
size)
{
if
(!isAutoSizeEnabled())
{
setTextSizeInternal(unit,
size,
true
/*
shouldRequestLayout
*/);
}
}很显然是调用了setTextSizeInternal(unit,size,true/*shouldRequestLayout*/);。看到这累不,不过看都看了就再看看呗,说不定比苍老师好看:
private
void
setTextSizeInternal(int
unit,
float
size,
boolean
shouldRequestLayout)
{
Context
c
=
getContext();
Resources
r;
if
(c
==
null)
{
r
=
Resources.getSystem();
}
else
{
r
=
c.getResources();
}
setRawTextSize(TypedValue.appl
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2023年湖南省环境状况公报
- 2023年药品注册管理办法办法
- 2023年生物制药企业公司组织架构和部门职能设计
- 放射科医师考核试题
- 2023年无烟日培训总结
- 朱久文苏州圆融时代广场专题案例研究报告
- 内科学:常见危急重症考试资料三
- 内科学(医学高级):呼吸系统疾病必看考点(强化练习)
- 2024年04月福建漳州卫生职业学院招考聘用17人笔试历年(难与易错考点)高频考题后附答案详解
- 2024年04月浙江省台州市交通运输局所属事业单位2024年选聘3名工作人员笔试历年(难与易错考点)高频考题后附答案详解
- 粉煤灰供货服务方案
- 幼儿绘本故事:《换一换》原版有声PPT课件
- 《孝经》解读解析72页PPT课件
- 沪教版(上海)七年级下册数学 第十四章 三角形 单元复习 导学案设计
- 中国林蛙哈士蟆养殖技术全籍
- 液压系统装配作业指导书
- 液压专业必备英文对照
- 关于“上浮、下沉、漂浮、悬浮”几个概念
- 酒店宾馆安全隐患检查表(汇总表)供参考
- TI__C2000_DSP培训
- 2021-2022学年部编版语文二年级下册第五单元测试卷
评论
0/150
提交评论