`

Java代码获取xml中定义的dp\sp值的方法

 
阅读更多

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);
         }
}
 

分享到:
评论

相关推荐

    屏幕适配dimens.xml适配

    在提供的`DimenTool.java`文件中,可能包含了一些辅助方法,帮助开发者更方便地获取和处理`dimens.xml`中的值。例如,它可能提供了根据屏幕密度动态计算尺寸的方法,或者将dimen资源转换为其他单位的功能。这样的...

    Android像素转换dp转px或相反

    在Android开发中,我们可以使用以下Java代码来实现dp和px的转换: ```java public class DisplayUtils { // dp转px public static float dpToPx(Context context, float dp) { return dp * context.getResources...

    应用源码之XmlValuesSample2.zip

    5. **值的动态获取**:在Android代码中,我们可以使用Resources类来获取XML文件中定义的值,如: ```java String appName = getResources().getString(R.string.app_name); int backgroundColor = ContextCompat....

    Android中使用字符串资源完成教学案例的实现步骤.pdf

    本文将详细讲解如何在Android中使用字符串资源来实现教学案例,包括在XML文件中定义字符串、在XML布局文件中引用字符串以及在Java代码中处理字符串。 1. **在strings.xml文件中定义字符串** 在`res/values/strings...

    AttributeSetDemo

    3. **尺寸值**:`dimen`类型用于定义尺寸,如宽度、高度、间距等,可以是像素值或与屏幕密度相关的比例值(例如dp、sp)。 4. **引用值**:`reference`类型允许引用其他资源,如布局、颜色、字体等。 5. **风格值*...

    Android 逻辑代码设置资源文件属性

    在Android中,我们通常会在XML布局文件中定义字体大小,但有时我们需要根据用户需求或特定场景动态调整。这可以通过`TextView`的`setTextSize()`方法实现,例如: ```java TextView myTextView = findViewById(R.id...

    Android常用Resource使用例子

    TypedArray提供了一种从XML资源文件中一次性获取多个值的方法,常用于自定义View。例如,定义一个属性集: ```xml ``` 在自定义View中解析: ```java TypedArray attributes = context....

    Android中使用字符串资源完成教学案例的代码清单.pdf

    接着,通过`getResources().getString(R.string.info)`方法从`res/values/strings.xml`文件中获取指定的字符串资源。`R.string.info`是一个引用,指向我们在资源文件中定义的字符串。 在`strings.xml`文件中,通常...

    Android开发之简易计算器 源码

    这可能包括使用尺寸单位dp和sp,以及在布局文件中使用权重来确保不同屏幕尺寸下的界面布局合理。 最后,源码中可能还包括了一些基本的调试和错误处理代码,如日志打印(`Log.d()`)和异常捕获(`try-catch`),以...

    移动终端应用开发题库

    - src目录包含Java源代码。 - assets目录存放原始资源,不会被R类引用,适合放未处理的数据。 - res目录下的资源会被R类索引,方便引用。 - AndroidManifest.xml文件非常重要,记录应用的组件、权限等信息,通常...

    安卓笔记文档

    在Java代码中通过`getResources().getColor()`方法获取定义的颜色值。 ```java view.setTextColor(getResources().getColor(R.color.mycolor)); ``` ### 二、按键事件处理 按键事件是安卓应用中常见的交互方式之...

    APP简单界面设计

    4. **Java代码与XML结合**:在Java代码中,我们可以通过`findViewById()`方法获取XML布局文件中的特定视图,并进行交互。例如,`Button button = findViewById(R.id.my_button);`找到ID为`my_button`的按钮,然后...

    安卓开发-androd自定义有进度的圆形进度条.zip.zip

    Android使用XML布局文件来定义用户界面,并通过Java代码进行动态控制。在自定义视图时,我们通常会继承自`View`或`ViewGroup`类,并覆盖其中的一些关键方法,如`onDraw()`,来实现自定义的绘制逻辑。 1. **自定义...

    Android布局文件的属性值解析

    在Java代码中可以通过以下方式获取该按钮的引用: ```java Button button = findViewById(R.id.button1); ``` #### android:text `android:text` 属性用于设置文本视图(如TextView或Button)中的显示文本。可以...

    Android各机型的屏幕适配

    3. 动态获取尺寸:在代码中,可以使用`Resources.getDimension()`方法动态获取尺寸值,例如: ```java float textSize = getResources().getDimension(R.dimen.text_size); ``` 四、多密度适配策略 1. dp与sp单位...

    Android学习笔记(三九):资源resource(下).doc

    在Java代码中获取数组: ```java String[] cities = getResources().getStringArray(R.array.cities); ``` 并可用来初始化ListView的Adapter: ```java setListAdapter(new ArrayAdapter(this, android.R.layout....

    物联网系列专业课程:Android用户界面开发.pptx

    8. **创建对象和引用**:使用`findViewById()`方法获取XML布局中定义的控件对象,如`Button myButton = (Button) findViewById(R.id.button1)`,之后可以对这些控件进行操作,如设置文字、监听事件等。 在实际开发...

    Android应用源码之仿UCWEB界面源码.zip

    在`UIMainDemo`的Java代码中,开发者可能使用`setContentView()`方法将XML布局加载到活动中,并通过findViewById()方法获取到XML布局中的各个视图对象,以便进行事件监听和数据绑定。例如,可能有对`WebView`设置...

    Toast_java_Toast_

    在提供的压缩包文件“Android例子源码自定义彩色Toast”中,你应该能够找到一个完整的示例项目,包括上述的布局文件和Java代码,你可以下载并运行它来查看实际效果。 总结一下,自定义`Toast`颜色的关键在于创建一...

Global site tag (gtag.js) - Google Analytics