TypedValue.applyDimension,代码实现px与dip转换

//转换dip为px

public static int convertDipOrPx(Context context, int dip) {

float scale = context.getResources().getDisplayMetrics().density;

return (int)(dip*scale + 0.5f*(dip>=0?1:-1));

}

//转换px为dip

public static int convertPxOrDip(Context context, int px) {

float scale = context.getResources().getDisplayMetrics().density;

return (int)(px/scale + 0.5f*(px>=0?1:-1));

}

首先我要说一句:dip不是像素密度,像素密度是dpi,引用句原话dip: device independent pixels(设备独立像素). 不同设备有不同的显示效果,这个和设备硬件有关,一般我们为了支持WVGA、HVGA和QVGA 推荐使用这个,不依赖像素。好了,入正题吧,先说说px,px就是像素,如果用px,就会用实际像素画,比个如吧,用画一条长度为240px的横线,在480宽的模拟器上看就是一半的屏宽,而在320宽的模拟器上看就是2/3的屏宽了。而dip,就是把屏幕的高分成480分,宽分成320分。

Resources resources = getResources();

floatfPx = TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP,300, resources.getDisplayMetrics());

这是错误的,这个方法是把 指定单位的 值,转换为像素。

正确理解,第一个参数为 单位,第二个参数为单位(第一个参数设置的单位)指定的值,返回值 都是像素

如TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_PX, 300, resources.getDisplayMetrics());

就是 像素 转 像素,还是300. 可以看源码

// 同理 px转dip:

// float fDip = TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_PX, 300, resources.getDisplayMetrics());

// int iDip = Math.round(fDip);

intiPx = Math.round(fPx);

EditText editText =newEditText(this);

editText.setWidth(iPx);

editText.setHeight(LayoutParams.WRAP_CONTENT);

// 或者

// LayoutParams layoutParams = new LayoutParams(iPx, LayoutParams.WRAP_CONTENT);

// editText .setLayoutParams(layoutParams);

你可能感兴趣的:(TypedValue.applyDimension,代码实现px与dip转换)