Android dp和px之间转换 及 获取坐标

dp、px、sp转换

  1.  1 public class DensityUtil {  
     2     /** 
     3      * 将px值转换为dip或dp值,保证尺寸大小不变 
     4      *  
     5      * @param pxValue 
     6      * @param scale 
     7      *            (DisplayMetrics类中属性density)  
     8      */  
     9     public static int px2dip(float pxValue, float scale) {  
    10         return (int) (pxValue / scale + 0.5f);  
    11     }  
    12   
    13     /** 
    14      * 将dip或dp值转换为px值,保证尺寸大小不变 
    15      *  
    16      * @param dipValue 
    17      * @param scale 
    18      *            (DisplayMetrics类中属性density)  
    19      */  
    20     public static int dip2px(float dipValue, float scale) {  
    21         return (int) (dipValue * scale + 0.5f);  
    22     }  
    23   
    24     /** 
    25      * 将px值转换为sp值,保证文字大小不变 
    26      *  
    27      * @param pxValue 
    28      * @param fontScale 
    29      *            (DisplayMetrics类中属性scaledDensity) 
    30      */  
    31     public static int px2sp(float pxValue, float fontScale) {  
    32         return (int) (pxValue / fontScale + 0.5f);  
    33     }  
    34   
    35     /** 
    36      * 将sp值转换为px值,保证文字大小不变 
    37      *  
    38      * @param spValue 
    39      * @param fontScale 
    40      *            (DisplayMetrics类中属性scaledDensity) 
    41      */  
    42     public static int sp2px(float spValue, float fontScale) {  
    43         return (int) (spValue * fontScale + 0.5f);  
    44     }  
    45 }  

但为什么 最后都要加上0.5f 呢? 

按正常的推理应该是  dip = pxValue / scale 和 px = dipValue * scale ,

实际上准确的值就应该是 咱们推理出来的,之所以后面加上0.5f是因为 咱们要的只不是那么精准,根据推理算出来的是个浮点数,而咱们程序中一般使用int类型就够了,这里涉及到一个类型转换精准度问题,熟悉Java特效的同学应该知道

float 类型的 4.1 和4.9 强转成int类型后,会失去精准度变成 int类型的4, 而如果咱们想四舍五入的话,把他们都加上0.5f,这样转换出来的结果就是:

4.4 + 0.5 = 4.9 转为int 还是4,而4.5 + 0.5 = 5.0 转换成int后就是5,正好是四舍五入,这样就保证了咱们算出来的值相对精准。

Android坐标

 android中有两种坐标系,分别称之为Android坐标系和视图坐标系。而对应的也有一些相关的方法可以获取坐标系中的

坐标值。只有搞清楚这些区别,才能在实现的时候不至于出错或者得不到你想要的效果。

一、Android坐标系和视图坐标系

    (1)Android坐标系

      先来看一看Android坐标系是个什么样子的。贴一张图来说明,如下:

     如上图所示,Android坐标系以手机屏幕左上角的顶点为坐标原点,从该点向右为x轴正方向,从该点向下为y轴正方向。而触控事件中,使用getRawX()和getRawY()方法

获取的坐标就是以这个坐标系为标准下的坐标值。

    (2)视图坐标系

    android中的另外一个坐标系叫做视图坐标系,它描述的是子视图在父视图中的位置。再贴一张图来说明,如下:

      如上图所示,视图坐标系是以父视图的左上角为坐标原点的。相应的原点向右为x轴正方向,原点向下为y轴正方向。在触控中,通过

getX()和getY()来获取的坐标值就是视图坐标系中的坐标值。

二、获取坐标值以及相对距离的那些方法

      在android中,提供了非常丰富的方法来获得坐标值和相对距离。但是在使用这些方法的时候,一定要清楚是以哪个坐标系为标准来获取的。

为了将这些方法一一说明清楚,我也准备了一张图,如下:

     上面的那张图很好的说明了每个方法获得的坐标值或者距离都是从哪里到哪里的。说明一下,图中有三个黑色的框框,最外层的是手机屏幕,

中间层的是ViewGroup,最内层的是ViewGroup中放置的view。

     其实上图中标注的方法可以分为两类,一类是View提供的方法,一类是MotionEvent提供的方法。分别说明如下:

View提供的获取的坐标以及距离的方法:

getTop()           获取到的是view自身的顶边到其父布局顶边的距离

getLeft()           获取到的是view自身的左边到其父布局左边的距离

getRight()        获取到的是view自身的右边到其父布局左边的距离

getBottom()     获取到的是view自身底边到其父布局顶边的距离

MotionEvent提供的方法:

getX()       获取点击事件距离控件左边的距离,即视图坐标

getY()       获取点击事件距离控件顶边的距离,即视图坐标

getRawX()  获取到的是点击事件距离整个屏幕左边的距离,即绝对坐标

getRawY()  获取到的是点击事件距离整个屏幕顶边的距离,即绝对坐标

原文地址:https://www.cnblogs.com/Claire6649/p/5948845.html