一、参考
1、【Android技术】Android px、dp、sp之间相互转换
2、dpi 、 dip 、分辨率、屏幕尺寸、px、density 关系以及换算
3、[Android] Android开发中dip,dpi,density,px等详解
4、getDimension与getDimensionPixelOffset与getDimensionPixelSize的区别
5、Android 获取控件的宽和高
6、手动修改屏幕密度:ro.sf.lcd_density
二、实例(屏幕信息,sp,dip,px的获取,转换,运用)
1、截图
2、代码
/**
* 屏幕信息
* densityDpi = density * strDpi(160)
*
* 常用屏幕信息三种方法
* 方法1:
* DisplayMetrics mDisplayMetrics = new DisplayMetrics();//屏幕分辨率容器
getWindowManager().getDefaultDisplay().getMetrics(mDisplayMetrics);
方法2:
DisplayMetrics mDisplayMetrics = getResources().getDisplayMetrics();
方法3:
Display mDisplay = getWindowManager().getDefaultDisplay();
* */
private void testScreenInfo(){
//屏幕尺寸
DisplayMetrics dm = getResources().getDisplayMetrics();
int screenWidth = dm.widthPixels;
int screenHeight = dm.heightPixels;
int screenDensityDpi = dm.densityDpi; //屏幕密度
float screenDessity = dm.density; //屏幕密度比
float scaleDensity = dm.scaledDensity; //文字密度比(放大像素)
String screeninfo = "屏幕实际尺寸:"+screenWidth+"*"+screenHeight+
"\n界面密度(标准160):"+screenDensityDpi+
"\n屏幕密度比:"+screenDessity+",文字密度比:"+scaleDensity;
LogUtil.i(screeninfo);
tv_screen_info.setText(screeninfo);
}
/**
* 测试sp,dip,px之间的关系、转换、运用
* */
private void testSpDpPx(){
/*获得*/
int heightDip = 40; //40dp高度
int heightSp = 17; //17sp
float heightXmlPx = getResources().getDimension(R.dimen.test_height); //获得dimen定义高度px
float txtXmlPx = getResources().getDimension(R.dimen.test_tv_size); //获得dimen定义文字大小px
float txtSizeLayoutPx = tv_layout.getTextSize(); //获得控件的文字大小px
//这个需要在onCreate做完之后获得,否则一直为0,怎么获得参考下面的,就不写了
//参考:http://blog.csdn.net/johnny901114/article/details/7839512
int heightLayoutPx = tv_layout.getHeight(); //获得控件的高度px, default = 0, error
heightLayoutPx = tv_layout.getMeasuredHeight();
/*转换*/
LogUtil.i("convert : 40dip to "+ DisplayUtil.dip2px(instance,heightDip)+"px ,17sp to "+DisplayUtil.sp2px(instance,heightSp)+
"px\norg : heightXmlPx:"+heightXmlPx+"px, txtXmlPx="+txtXmlPx+
"px, heightLayoutPx="+heightLayoutPx+"px, txtSizeLayoutPx="+txtSizeLayoutPx+"px");
/*运用,动态布局中用得到*/
tv_code.setTextSize(heightSp); //这里直接设置需要的sp大小就行了,不需要转换
tv_code.setHeight(DisplayUtil.dip2px(instance,heightDip));//设置高度,需要px单位
//另外一种设置宽度,高度方法,比较常用:获得父控件的布局参数,然后设置进去
LinearLayout.LayoutParams params = (LinearLayout.LayoutParams) tv_code.getLayoutParams();
//params.weight=1;
params.width = LinearLayout.LayoutParams.WRAP_CONTENT;
params.height = DisplayUtil.dip2px(instance,heightDip);
tv_code.setLayoutParams(params);
}
3、工具类code
public class DisplayUtil {
/**
* 将px值转换为dip或dp值,保证尺寸大小不变
*
* @param pxValue
* (DisplayMetrics类中属性density)
* @return
*/
public static int px2dip(Context context, float pxValue) {
final float scale = context.getResources().getDisplayMetrics().density;
return (int) (pxValue / scale + 0.5f);
}
/**
* 将dip或dp值转换为px值,保证尺寸大小不变
*
* @param dipValue
* (DisplayMetrics类中属性density)
* @return
*/
public static int dip2px(Context context, float dipValue) {
final float scale = context.getResources().getDisplayMetrics().density;
return (int) (dipValue * scale + 0.5f);
}
/**
* 将dip或dp值转换为px值,保证尺寸大小不变
*
* @param dpResid
* xml中定义的dp属性
* getDimension() 返回float型px值 精确
getDimensionPixelOffset() 返回int型px值 直接把小数删除
getDimensionPixelSize() 返回int型px值 进行四舍五入
* @return
*/
public static int xmlDip2px(Context context, int dpResid) {
return context.getResources().getDimensionPixelOffset(dpResid);
}
/**
* 将px值转换为sp值,保证文字大小不变
*
* @param pxValue
* (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
* (DisplayMetrics类中属性scaledDensity)
* @return
*/
public static int sp2px(Context context, float spValue) {
final float fontScale = context.getResources().getDisplayMetrics().scaledDensity;
return (int) (spValue * fontScale + 0.5f);
}
/**
* 将sp值转换为px值,保证文字大小不变
*
* @param spResid
* xml中定义的sp属性
* getDimension() 返回float型px值 精确
getDimensionPixelOffset() 返回int型px值 直接把小数删除
getDimensionPixelSize() 返回int型px值 进行四舍五入
* @return
*/
public static int xmlSp2px(Context context, int spResid) {
return context.getResources().getDimensionPixelOffset(spResid);
}
}