在Android相关的工作过程中,不论是系统级的开发,还是App的开发,由于Android设备的多样性,对不同屏幕的适配和资源的管理,就成为我们必须面对的一个大问题。以下是在工作过程中,查询和学习到的Android资源使用规则相关的知识,和大家分享一下。
一,dip、dp、sp、px及其相互转换:
1,dip:device independent pixels(设备独立像素)。不同设备有不同的显示效果,这个和设备硬件有关,一般我们
为了支持WVGA、HVGA和QVGA推荐使用这个,不依赖像素。
(VGA是“Video Graphics Array”,即:显示绘图矩阵,显示标准为640*480
WVGA(Wide VGA)分辨率是480*800
HVGA(Half VGA)即VGA的一半分辨率为320*480
QVGA(Quarter VGA)即VGA的四分之一分辨率为240*320
WQVGA(Wild Quarter VGA),即扩大的QVGA,分辨率比QVGA高,比VGA低,一般是400*240,480*272)
2,dp:dip的另外一种说法,和dip是一样的
3,px:pixels(像素),不同设备不同的显示屏显示效果是相同的,这是绝对像素,是多少就永远是多少不会改变
4,sp:scaled pixels(放大像素),主要用于字体显示,best for textsize。
5,相互间的转化(以下为相互间转化的代码实例):
public class DisplayUtil {
//将px值转换为dip或者dp值,保证尺寸大小不变
public static int px2dip (Context context , float pxValue) {
final float scale = context.getResources().getDisplayMetrics().density;
return (int) (pxValue / scale + 0.5f);
}
//将dip或者dp值转换为px值,保证尺寸大小不变
public static int dip2px (Context context , float dipValue) {
final float scale = context.getResources().getDisplayMetrics().density;
return (int) (dipValue * scale + 0.5f);
}
//将px值转换为sp值,保证文字大小不变
public static int px2sp(Context context, float pxValue) {
final float fontScale = context.getResources().getDisplayMetrics().scaledDensity;
return (int) (pxValue / fontScale + 0.5f);
}
//将sp值转换为px值,保证文字大小不变
public static int sp2px(Context context, float spValue) {
final float fontScale = context.getResources().getDisplayMetrics().scaledDensity;
return (int) (spValue * fontScale + 0.5f);
}
}
二,android工程中资源文件夹的选择:
1,dpi是“dot per inch”的缩写,即每英寸像素数
四种密度分类:ldpi(low),mdpi(medium),hdpi(high) and xhdpi(extra high)
一般情况下的普通屏幕:ldpi是120,mdpi是160,hdpi是240,xhdpi是320.
2,获取屏幕长宽以及机器使用资源名称的代码实例:
public class getProperties {
TextView show;
String result ,des;
int mWidth,mHeight;
float mDensityDpi,mDp;
show = (TextView)findViewById(R.id.show);
Point pot = new Point();
DisplayMetrics dm = new DisplayMetrics();
Display d = getWindowManager().getDefaultDisplay();
//得到像素点(长和宽 pixels)
d.getSize(pot);
//得到DisplayMetrics
d.getMetrics(dm);
mWidth = pot.x;
mHeight = pot.y;
mDensityDpi = dm.densityDpi;
//DP
if(mWidth > mHeight) {
mDp = mHeight/(mDensityDpi/160);
}
else {
mDp = mWidth/(mDensityDpi/160);
}
if(mDensityDpi<120)
{
des = "ldpi";
}
else if(mDensityDpi<=160 && mDensityDpi>120)
{
des = "mdpi";
}else if(mDensityDpi<=240 && mDensityDpi>160)
{
des = "hdpi";
}else if(mDensityDpi<=320 && mDensityDpi>240)
{
des = "xhdpi";
}
else if(mDensityDpi<=480 && mDensityDpi>320)
{
des = "xxhdpi";
}
if(mWidth<mHeight) {
int temp = mWidth;
mWidth = mHeight;
mHeight = temp;
}
result = "分辨率"+mWidth+"x"+mHeight+"\n"
+"DPI:"+mDensityDpi+"\n"
+"资源:-sw"+(int)mDp + "-"+des +"\n";
show.setText(result);
}
3,在3.2之后,资源文件中可以看到类似-sw320dp-hdpi的文件夹。其中,sw = smallestwidth,即此目录中的资源支持的最小屏幕
宽度【这个值在同一设备上是固定值,不会随着转屏而改变】,而后面的hdpi就不用多说了,从开始即存在的屏幕密度。
(1, 优先级:sw>dpi
解释:选取资源时,先选定sw,再确定dpi
例子:手机设置为:-sw320dp-hdpi
当前资源有:-sw320dp-mdpi
-hdpi
使用资源为:-sw320dp-mdpi
(2, 应用资源不存在设定sw时,选择Max{<=设定sw}
(3, 应用资源不存在设定dpi时,选择Max dpi
例子:手机设置为:-sw320dp-hdpi
当前资源有:-sw480dp-hdpi
-hdpi
-sw240dp-ldpi
-sw240-xhdpi
-sw160dp-hdpi
使用资源:-sw240dp-xhdpi
希望以上总结能对大家有所帮助