安卓屏幕单位:
dp (dip): 即设备无关像素(device independent pixels),这种尺寸单位在不同设备上的物理大小相同。
px:即像素(pixel),这个不用多说。
pt:通常用来作为字体的尺寸单位,1 pt相当于1/72英寸。
inch:英寸,1 英寸约等于2.54厘米,主要用来描述手机屏幕的大小。
sp:大部分人只知道它通常用作字体的尺寸单位,实际大小还与具体设备上的用户设定有关。
在上面几种常见的尺寸单位,dp和sp可以看做是虚拟尺寸。其中dp是与设备无关的虚拟像素单位,开发者为UI控件指定以dp为单位的大小后,在不同屏幕密度的Android设备上便能够具有相同的物理尺寸。dp的出现让开发者无需关注屏幕密度、物理像素之间的换算关系。sp则与dp相似,但它主要用作字体的尺寸单位,与dp的区别是:Android系统支持用户设定字体大小,因而sp的实际大小还会根据用户设定在原基础上进行缩放。
来源链接:https://www.jianshu.com/p/bd3944b56b41
常用公式:dp = (px*160)/dpi
代码获取设备dpi:
DisplayMetrics dm = new DisplayMetrics();
dm = getContext().getResources().getDisplayMetrics();
int dpi = dm.densityDpi;
注:已知dpi 和dp 就可以算出px,每个设备的dpi可能是不一样的,但dp的值都是一样的(dp与设备无关),那如何保持dp的值不变,那就要可以让px的值是变化的,因为dpi也是变化的。
今日头条适配方案的配置:(详细链接:https://www.jianshu.com/p/4aa23d69d481)
1.build.gradle(app):
implementation ‘me.jessyan:autosize:0.9.5’
2.AndroidManifest.xml:自定义设计图的高和宽
<meta-data
android:name="design_width_in_dp"
android:value="411" />
<meta-data
android:name="design_height_in_dp"
android:value="731" />
3.需要自定义的适配的Activity实现 CustomAdapt,实现如下两个方法,isBaseOnWidth为true时,适配宽,为false 时,适配高。
@Override
public boolean isBaseOnWidth() {
return true;
}
@Override
public float getSizeInDp() {
return ScreenUtils.getAutoSizeHeight(this);
}
动态修改设计图的宽去适配不同dpi的设备:
ScreenUtils类:
/**
* 获得屏幕宽度
*
* @return
*/
public static int getScreenWidth(Context context)
{
WindowManager wm = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);
DisplayMetrics outMetrics = new DisplayMetrics();
wm.getDefaultDisplay().getMetrics(outMetrics);
return outMetrics.widthPixels;
}
public static int getAutoSizeHeight(Context context) {
int width = 411;
try {
double idthwpx = getScreenWidth(context);
if(idthwpx >= 1440) {
width = 461;
}
} catch (Exception e) {
e.printStackTrace();
} finally {
return width;
}
}