【移动应用开发技术】怎么在Android中动态设置字体大小_第1页
【移动应用开发技术】怎么在Android中动态设置字体大小_第2页
【移动应用开发技术】怎么在Android中动态设置字体大小_第3页
【移动应用开发技术】怎么在Android中动态设置字体大小_第4页
【移动应用开发技术】怎么在Android中动态设置字体大小_第5页
免费预览已结束,剩余2页可下载查看

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

【移动应用开发技术】怎么在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. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论