近期在学习android过程中,看到有人在伯乐在线上分享如何开发自定义View的一系列文章。我觉得对于初学者,很有必要掌握它,因为今后很多时候系统自带的组件不足以满足我们的功能需求,那么我们就要根据需求来定义一个能满足我们需求的View组件。
但是我并不会按照伯乐在线的系列文章来学习,就记录我是怎么学的,今天来讲讲我对坐标的理解。参考:伯乐在线[安卓自定义View基础:坐标系]
Android移动设备的坐标一般定义屏幕左上角为坐标原点,与我们平时理解的坐标系统不一样的是:平时所理解的坐标Y轴向上增大,而Android移动设备是向下增长的。
独立像素(dp)和像素(px)
在讲View的坐标系统前首先需要掌握android中的dp与px之间的关系。
在开发过程中,肯定要给组件布局定位的,而android有两个常用计量单位独立像素(dp)和像素(px)。
px:因为pixel的缩写,它表示一个实实在在的物理像素。他不会随设备的分辨率改变而改变。
dp/dip:英文device independent pixels的简称,翻译成中文叫设备独立像素,为什么要有dp出来呢,因为我们的移动设备分辨率是有多种的,那么为了让应用中的view组件能够自适应各种分辨率的显示设备,于是乎就产生了dp。提高了程序的可移植性,因为android最终会将dp转成具体设备的像素数。最终是如何转换成px 的呢?先看下面的公式:
public static int dip2px(Context context, float dipValue){
final float scale = context.getResources().getDisplayMetrics().density;
return (int)(dipValue * scale + 0.5f);
}
上面的公式中出现了一个density,呵呵,又是一个新东西。不怕,找度娘,density表示每英寸有多少个显示点。但是我写了一个应用打印这个值为2.625,而我的屏幕实际density值为420。咦,为何不一样啊,这个问题困扰了我不少时间,估计大家也晕了,先不管,我们一个一个来,先来看看android是如何定义这里的density,如下:
/**
* The logical density of the display. This is a scaling factor for the
* Density Independent Pixel unit, where one DIP is one pixel on an
* approximately 160 dpi screen (for example a 240x320, 1.5"x2" screen),
* providing the baseline of the system's display. Thus on a 160dpi screen
* this density value will be 1; on a 120 dpi screen it would be .75; etc.
*
* <p>This value does not exactly follow the real screen size (as given by
* {@link #xdpi} and {@link #ydpi}, but rather is used to scale the size of
* the overall UI in steps based on gross changes in the display dpi. For
* example, a 240x320 screen will have a density of 1