Android之单位转换

文章链接:http://blog.csdn.net/qq_16628781/article/details/68939039

知识点

  1. dip/dpi和Android屏幕的说明;
  2. dp转dx/dx转dp的示例;
  3. TypedValue进行单位转换及示例;
  4. 新名词记录{TypedValue:Android自身提供的单位转换类;DP/DIP/DX屏幕单位换算;}

概述

如今,Android的碎片化真的是令人惨不忍睹,所以Google在新的版本中,会逐渐地收紧权限,要统一Android“江湖”了。所以呢,我们做开发的,就需要进行适配了。首先来了解下屏幕单位的一些知识:

dip不是像素密度,像素密度是dpi,引用句原话dip: device independent pixels(设备独立像素). 不同设备有不同的显示效果,这个和设备硬件有关,一般我们为了支持WVGA、HVGA和QVGA 推荐使用这个,不依赖像素。px是像素,如果用px,就会用实际像素画,比如,用画一条长度为240px的横线,在480宽的模拟器上看就是一半的屏宽,而在320宽的模拟器上看就是2/3的屏宽了。而dip,就是把屏幕的高分成480分,宽分成320分。

/**      * 根据手机的分辨率从 dp 的单位 转成为 px(像素)      *     * @param context      * @param dpValue      */      public static int dip2px(Context context, float dpValue) {          final float scale = context.getResources().getDisplayMetrics().density;          return (int) (dpValue * scale + 0.5f);      }      /**      * 根据手机的分辨率从 px(像素) 的单位 转成为 dp      *     * @param context      * @param pxValue      */      public static int px2dip(Context context, float pxValue) {          final float scale = context.getResources().getDisplayMetrics().density;          return (int) (pxValue / scale + 0.5f);      }      /**          * 将px值转换为sp值,保证文字大小不变          *           * @param pxValue          * @param fontScale          *            (DisplayMetrics类中属性scaledDensity)          * @return          */          public static int px2sp(Context context, float pxValue) {              final float fontScale = context.getResources().getDisplayMetrics().scaledDensity;              return (int) (pxValue / fontScale + 0.5f);          }          /**          * 将sp值转换为px值,保证文字大小不变          *           * @param spValue          * @param fontScale          *            (DisplayMetrics类中属性scaledDensity)          * @return          */          public static int sp2px(Context context, float spValue) {              final float fontScale = context.getResources().getDisplayMetrics().scaledDensity;              return (int) (spValue * fontScale + 0.5f);          }                     
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47

另一种转换方式:TypedValue类

实际上,Android中也提供了单位转换的函数,那就是TypedValue类。

TypedValue:这个类是工具类,作为一个动态容器,它存放一些数据值,这些值主要是resource中的值。TypedValue类把对应的值转化为实际屏幕上的点值,也就是像素值。

具体的用法如下:

TypedValue.applyDimension(int unit, float value, DisplayMetrics metrics)                    
  • 1

其中,第一个参数是你想要得到的单位,第二个参数是你想得到的单位的数值,第三个参数封装了显示区域的各种属性值。

例如,我要得到一个25sp,那么我就用

TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_SP, 25,context.getResources().getDisplayMetrics())                    
  • 1

就是说,我想要一个25(第二个参数)SP(第一个参数)在当前设备上对应的px值。

注意:

COMPLEX_UNIT_DIP:乘以显示密度density(dpi/160)。

TypedValue.COMPLEX_UNIT_SP:乘以像素密度scaledDensity(=density)。


总结

无论使用哪一种方法来实现单位转换,我们都是为了屏幕的适配。屏幕适配是一个“很大(很坑)”的课题,需要我们持续的去进行探索和积累,脚步绝对不能够停下来滴。共勉。

如有任何问题,请及时与我联系。谢谢。

更多相关文章

  1. Android 支持多屏幕机制
  2. Android 使用SeekBar 变更屏幕亮度和声音音量
  3. Android屏幕适配终极方案-原理篇
  4. Android screenOrientation 屏幕方向的设定与控制
  5. android ScrollView 充满屏幕
  6. android 拖动条改变屏幕亮度
  7. android屏幕分辨率适配
  8. 去掉android的屏幕上的title bar

随机推荐

  1. Windows下使用性能监视器监控SqlServer的
  2. SqlServer 2000、2005分页存储过程整理第
  3. 和表值函数连接引发的性能问题分析
  4. 在SQL Server中将数据导出为XML和Json的
  5. sql server中Select count(*)和Count(1)
  6. SQL Server中使用SQL语句实现把重复行数
  7. SQL Server中统计每个表行数的快速方法
  8. Sql Server中的事务介绍
  9. Sql Server中的视图介绍
  10. SQL Server数据库中的存储过程介绍