android TypedValue.applyDimension()的探究

这个方法是转变为标准尺寸的一个函数,例如

int size = (int)TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 20, context.getResources().getDisplayMetrics());

这里COMPLEX_UNIT_DIP是单位,20是数值,也就是20dp。

详细探究:

 //转换dip为px
 2 public static int convertDipOrPx(Context context, int dip) {
 3     float scale = context.getResources().getDisplayMetrics().density;
 4     return (int)(dip*scale + 0.5f*(dip>=0?1:-1));
 5 }
 6
 7 //转换px为dip
 8 public static int convertPxOrDip(Context context, int px) {
 9     float scale = context.getResources().getDisplayMetrics().density;
10     return (int)(px/scale + 0.5f*(px>=0?1:-1));
11 } 

然后看到了一种新的转化方式,代码如下:

1 public static int dp2sp(float dpVal){
2     return (int)(TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, dpVal,
3             MyAppliction.getInstance().getApplicationContext().getResources().getDisplayMetrics()));
4 }
5  //?????
6 public static int sp2dp(float spVal){
7     return (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_SP, spVal,
8             MyAppliction.getInstance().getApplicationContext().getResources().getDisplayMetrics()));
9 }

码农对TypedValue充满好奇,通过查询官网了解该类

TypedValue

---android.util.TypedValue
 Container for a dynamically typed data value. Primarily used with Resources for holding resource values.

翻译过来就是:这个类是工具类,作为一个动态容器,它存放一些数据值,这些值主要是resource中的值。

我们来理解一下:resource中到底有哪些值?layout、drawable、string、style、anim、dimens、menu、colors、ids这些值一些和屏幕适配有直接的关系。

有一些方法必然是可以读取这些资源文件信息的,比如:

getDimension(DisplayMetrics metrics)

再看具体的方法:

applyDimension(int unit, float value,DisplayMetrics metrics)
第一个参数是单位,第二个参数是对应值,第三个你懂的,封装了显示区域的各种属性值。
对于applyDimension(int unit, float value,DisplayMetrics metrics)中的代码我们来看下

 1  public static float applyDimension(int unit, float value,
 2                                        DisplayMetrics metrics)
 3     {
 4         switch (unit) {
 5         case COMPLEX_UNIT_PX:
 6             return value;
 7         case COMPLEX_UNIT_DIP:
 8             return value * metrics.density;
 9         case COMPLEX_UNIT_SP:
10             return value * metrics.scaledDensity;
11         case COMPLEX_UNIT_PT:
12             return value * metrics.xdpi * (1.0f/72);
13         case COMPLEX_UNIT_IN:
14             return value * metrics.xdpi;
15         case COMPLEX_UNIT_MM:
16             return value * metrics.xdpi * (1.0f/25.4f);
17         }
18         return 0;
19     }

其中单位为dip的,将其转化为密度*值,也就是像素值,而单位sp的也将其转化为px值,因此该方法可以能进行

dip-->px

sp-- >px

因此上面

TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_SP, value ,DisplayMetrics );
这个方法肯定不能将sp转化为dp,我们判断

dp2sp(50) = 150

sp2dp(50) = 150

convertDipOrPx(50) = 150

convertPxOrDip(50) = 17
将代码运行实际结果与判断结果一致。

接下来我们继续分析

TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_SP, value ,DisplayMetrics );
该方法系统本意是用来做什么的?

查看官方说明:

Converts an unpacked complex data value holding a dimension to its final floating point value.

这里就把对应的值转化为实际屏幕上的点值,也就是像素值。
如果是TypedValue.COMPLEX_UNIT_DIP,则乘以显示密度density。

而如果是TypedValue.COMPLEX_UNIT_SP,则乘以像素密度scaledDensity

 

我们继续刨根追底

density和scaledDensity的区别在于

density:The logical density of the display.显示密度density = dpi/160

scaledDensity:A scaling factor for fonts displayed on the display.显示字体的缩放因子 = density

实际上两者的值一样,为了验证这个结论我们随便找两台机器小米2S和华为p7,取出density和scaledDensity是一致的,P7为3.0,小米2S = 2.0

因此本文结论转化dp-px,px-dp,sp-px,px-sp

使用下面方法:

 1 //转换dip为px
 2   public static int convertDipOrPx(Context context, int dip) {
 3       float scale = context.getResources().getDisplayMetrics().density;
 4       return (int)(dip*scale + 0.5f*(dip>=0?1:-1));
 5   }
 6
 7   //转换px为dip
 8   public static int convertPxOrDip(Context context, int px) {
 9       float scale = context.getResources().getDisplayMetrics().density;
10      return (int)(px/scale + 0.5f*(px>=0?1:-1));
11  }
12
13   public static int sp2px(Context context, float spValue) {
14         float fontScale = context.getResources().getDisplayMetrics().scaledDensity;
15         return (int) (spValue * fontScale + 0.5f);
16     }
17
18     public static int px2sp(Context context, float pxValue) {
19         float fontScale = context.getResources().getDisplayMetrics().scaledDensity;
20         return (int) (pxValue / fontScale + 0.5f);
21     }

本文转自:http://www.cnblogs.com/xilinch/p/4444833.html

时间: 2024-10-20 11:03:05

android TypedValue.applyDimension()的探究的相关文章

[Android Pro] Android TypedValue.applyDimension()的用法

reference to  : http://blog.csdn.net/voo00oov/article/details/45745819 这个方法的作用是 把Android系统中的非标准度量尺寸转变为标准度量尺寸 (Android系统中的标准尺寸是px, 即像素) Android系统中的尺寸单位有: 这个方法的作用是 把Android系统中的非标准度量尺寸转变为标准度量尺寸 (Android系统中的标准尺寸是px, 即像素) Android系统中的尺寸单位有: 标准单位: px (px是安卓

android TypedValue.applyDimension()的作用

这个方法是转变为标准尺寸的一个函数,例如 int size = (int)TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_SP, 20, context.getResources().getDisplayMetrics()); 这里COMPLEX_UNIT_SP是单位,20是数值,也就是20sp.

android中TypedValue.applyDimension()的作用

android TypedValue.applyDimension()的作用这个方法是转变为标准尺寸的一个函数,例如int size =(int)TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_SP, 20,context.getResources().getDisplayMetrics()); 这里COMPLEX_UNIT_SP是单位,20是数值,也就是20sp.

android.util.TypedValue.applyDimension

先看一个例子: int size = (int)TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 3, context.getResources().getDisplayMetrics()); 这行代码是把在当前屏幕分辨率的状态下将dip为3的值转换成单位为px值 下面是API介绍: public static float applyDimension (int unit, float value, DisplayMetrics met

TypedValue.applyDimension 中dp和sp之间转化的真相

最近在看了许多关于dp-px,px-dp,sp-px,px-sp之间转化的博文,过去我比较常用的方式是: 1 //转换dip为px 2 public static int convertDipOrPx(Context context, int dip) { 3 float scale = context.getResources().getDisplayMetrics().density; 4 return (int)(dip*scale + 0.5f*(dip>=0?1:-1)); 5 } 6

android 布局之滑动探究 scrollTo 和 scrollBy 方法使用说明

涉及到滑动,就涉及到VIEW,大家都知道,android的UI界面都是由一个一个的View以及View的派生类组成,View作为基类,而常用的布局里面的各种布局就是它派生出来的ViewGroup的子类,ViewGroup作为各个组件的容器搭建了整体的UI.以下是android UI的结构示示意图: 查看源码 /** * Implement this to do your drawing. * * @param canvas the canvas on which the background w

Android类库打包方法探究

转自:Android类库打包方法探究 开发Android应用的时候,对于可用于多个应用的公用的部分,或是打算发布给第三方进行应用集成的部分,要把这部分打包成类库怎么做呢?众所周知,Android应用使用ADT打包成apk,apk中包含了运行程序所需要的一切,包括:class.asset.res.AndroidManifest.xml等.而对于类库项目(library project),ADT生成的jar包里只包含编译生成的class文件,不包含res资源文件,res只能在应用项目打包apk的时候

[Android]AndroidDesign中ActionBar探究1

概述 从Google IO 2013大会以来越来越多的Android应用开始遵循Android的设计风格,简单的就是google play和Gmail,在国内我们常用的软件像知乎.印象笔记,主要的界面主要是左侧的抽屉菜单(参照).顶部和底部的ActionBar(参照)等.由于以前都是遵循Ios的设计开始开发的一些,现在在公司,公司开始推崇Android Desgin(我们公司总是走在前列啊,现在Team 开发的 Version Control开始在Git开发),我们也必须要看下ActionBar

TypedValue.applyDimension()的作用

这个是我整理下来的,留着以后看的 int padding = (int)TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 4, getActivity().getResources().getDisplayMetrics()); text.setPadding(padding, padding, padding, padding); 我的理解:padding的单位是:dip, padding的大小是:4 , 最后将text的上下左右pa