android并没有在java代码中直接获取xml中定义的dp\sp的值的API,只有getDimension()、getDimensionPixelOffset()和getDimensionPixelSize()三个函数获取绝对尺寸,关于这三个函数的区别可以参见我的另一个帖子getDimension()、getDimensionPixelOffset()和getDimensionPixelSize()区别详解 。
为什么不提供获取dp/sp值的函数?可能是因为google认为没有必要,API里的setWidth、setHeight等函数输入参数都是像素值。但如果实在想得到xml中咱们自己写的dp或sp的值(例如想在日志里输出dp\sp什么的),有两种方法可以实现:
第一种方法就是将像素值转化为dp\sp,这类代码网上已经满天飞了,这里为了阅读本帖的朋友们方便,我还是把这个代码贴出来(请见本帖结尾)
上述方法本身没什么问题,但如果对于代码洁癖或“吹毛求疵”的人来说,有个烦人的地方是将像素转化为sp\dp都是不同的函数接口,例如px2dip(),px2sp(),其实android还支持英寸、毫米和磅,但这些都不常用,但如果做全了,还应该有px2in(), px2mm(), px2pt()这些函数,那么我在代码中想获取我在xml中定义的尺寸时,还需要在这么多个函数里面选,好麻烦啊(程序员都是懒惰的),有没有简单直接的调用方法呢? 答案是有的,这就是本文阐述的方法:
其实在研究getDimension()、getDimensionPixelOffset()和getDimensionPixelSize()这三个函数源码时,会发现这三个函数的实现都是先获取在xml中定义的值,然后再根据是dp/sp/in/mm/pt转化成相应的像素值,所以,我们只需要把android的部分代码抽出来即可,封装成一个小工具类如下:
代码片段,双击复制
public class ResourceUtils {
private static TypedValue mTmpValue = new TypedValue();
private ResourceUtils(){}
public static int getXmlDef(Context context, int id){
synchronized (mTmpValue) {
TypedValue value = mTmpValue;
context.getResources().getValue(id, value, true);
return (int)TypedValue.complexToFloat(value.data);
}
}
}
然后在代码里我们就可以直接这么写了
代码片段,双击复制
ResourceUtils.getXmlDef(context, R.dimen.test_dp)
搞定,事情变的简单了~ 根据id不同,如果id对应的是dp的,那函数返回的就是dp值,如果id对应的是sp的,那函数返回的就是sp值,一个函数入口就行了~
这里有个android的小的优化点值得学习,就是mTmpValue临时变量的设计。为了不在每一个getResources().getXXX()函数里都new TypedValue(),使用一个mTmpValue临时变量进行缓存重复使用,并加上同步保护,减少了内存占用,可见google为了优化内存的用心~
顺带贴上第一种方法的代码,其实这段代码网上满天飞了
代码片段,双击复制
public class DisplayUtil {
private DisplayUtil(){}
/**
* 将px值转换为dip或dp值,保证尺寸大小不变
* @param context
* @param pxValue
* @return
*/
public static int px2dip(Context context, float pxValue) {
final float scale = context.getResources().getDisplayMetrics().density;
return (int) (pxValue / scale + 0.5f);
}
/**
* 将dip或dp值转换为px值,保证尺寸大小不变
* @param dipValue
* @param scale
* @return
*/
public static int dip2px(Context context, float dipValue) {
final float scale = context.getResources().getDisplayMetrics().density;
return (int) (dipValue * scale + 0.5f);
}
/**
* 将px值转换为sp值,保证文字大小不变
* @param pxValue
* @param fontScale
* @return
*/
public static int px2sp(Context context, float pxValue) {
final float fontScale = context.getResources().getDisplayMetrics().scaledDensity;
return (int) (pxValue / fontScale + 0.5f);
}
/**
* 将px值转换为sp值,保证文字大小不变
* @param spValue
* @param fontScale
* @return
*/
public static int sp2px(Context context, float spValue) {
final float fontScale = context.getResources().getDisplayMetrics().scaledDensity;
return (int) (spValue * fontScale + 0.5f);
}
}
相关推荐
java在线解析xmljava在线解析xmljava在线解析xmljava在线解析xmljava在线解析xmljava在线解析xmljava在线解析xmljava在线解析xmljava在线解析xmljava在线解析xmljava在线解析xmljava在线解析xmljava在线解析xmljava...
主要介绍了Java使用正则表达式提取XML节点内容的方法,结合具体实例形式分析了java针对xml格式字符串的正则匹配相关操作技巧,需要的朋友可以参考下
java http 发送xml报文(java发送xml报文实例+参数)java http 发送xml报文java http 发送xml报文(java发送xml报文实例+参数)
用java读取xml文件的四种方法
java http 发送xml报文java http 发送xml报文java http 发送xml报文java http 发送xml报文java http 发送xml报文java http 发送xml报文java http 发送xml报文java http 发送xml报文java http 发送xml报文java http ...
java 解析XML修改路径值java 解析XML修改路径值
使用xpath读取xml中的数据
这是一个java对xml操作的两个类,xml文件的节点都是已知的,都需要提前指定.
通过不同的库方法读取修改xml文件。通过java实现。代码易懂
java读写xml的代码
java代码-使用java解决JTree访问XML的源代码 ——学习参考资料:仅用于个人学习使用!
JAVA中生成xml文件到指定路径和上传到ftp服务器到指定路径的方法。
java实现xml解析word文档代码实现,通过解析word书签实现java动态写入word文档。方便使用。
讲解String.xml标签在布局文件中及java代码中的引用
不用任何jar包,解析xml内容。相同节点多个时。可以一次解析所有的内容。
idea统一java格式化xml文件
JAVA代码注释规范codetemplates.xml,可直接导入Eclipse,代码注释效果很棒!
文件里包含jar包 dom4j-1.6.1.jar,list中放多个map,map里随意放键值对,最后可转换为xml文档,xml文档也可以解析存入list文件中
java代码-使用java解决XML2JTree的源代码 ——学习参考资料:仅用于个人学习使用!
XML的java代码实现,可以实现整体加密,元素加密,内容加密