Android资源使用规则

在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


希望以上总结能对大家有所帮助

猜你喜欢

转载自blog.csdn.net/u011938614/article/details/44145103