适配原因
原生渲染前会将dp转为px,dpi就是导致差异化因素也叫像素密度,根据设备分辨率和尺寸计算得出,出厂时已经决定了
density = dpi / 160
px = dp * density
适配方案
1.dimens基于px适配(宽高限定符适配)
在res文件中,定义不同分辨率px参数,例如values-480*320 ,但是这种方案由于手机分辨率太多,局限性太高,弃用。
2.dimens基于dp适配(smallestWidth适配)
这种是根据最小宽度限定符,android会识别屏幕可用宽高的最小dp值,然后根据结果去寻找对应限定符的文件夹下的资源文件。
比如没有value-sw360dp 文件夹会向下寻找 value-sw350dp ,这种增加了分辨率匹配的容错率。
但是这种弊端是,会增加多个文件夹,而且也不能完美匹配所有机型
3.今日头条适配
今日头条适配方案是通过修改手机设备密度density完成的,通过修改density值,强行把所有不同尺寸分辨率的手机的宽度dp值改成一个统一的值,这样就解决了所有的适配问题。
/**
* 适配:修改设备密度
*/
private static float sNoncompatDensity;
private static float sNoncompatScaledDensity;
public static void setCustomDensity(@NonNull Activity activity, @NonNull final Application application) {
DisplayMetrics appDisplayMetrics = application.getResources().getDisplayMetrics();
if (sNoncompatDensity == 0) {
sNoncompatDensity = appDisplayMetrics.density;
sNoncompatScaledDensity = appDisplayMetrics.scaledDensity;
// 防止系统切换后不起作用
application.registerComponentCallbacks(new ComponentCallbacks() {
@Override
public void onConfigurationChanged(Configuration newConfig) {
if (newConfig != null && newConfig.fontScale > 0) {
sNoncompatScaledDensity = application.getResources().getDisplayMetrics().scaledDensity;
}
}
@Override
public void onLowMemory() {
}
});
}
float targetDensity = appDisplayMetrics.widthPixels / 360;
// 防止字体变小
float targetScaleDensity = targetDensity * (sNoncompatScaledDensity / sNoncompatDensity);
int targetDensityDpi = (int) (160 * targetDensity);
appDisplayMetrics.density = targetDensity;
appDisplayMetrics.scaledDensity = targetScaleDensity;
appDisplayMetrics.densityDpi = targetDensityDpi;
final DisplayMetrics activityDisplayMetrics = activity.getResources().getDisplayMetrics();
activityDisplayMetrics.density = targetDensity;
activityDisplayMetrics.scaledDensity = targetScaleDensity;
activityDisplayMetrics.densityDpi = targetDensityDpi;
}
官方屏幕适配之ScreenMatch DP适配
Android ScreenMatch屏幕适配是一种简单适用的适配方式,是由Android官方推出的适配方法
1.首先下载安装ScreenMatch插件,Ctrl+Alt+S打开Plugins
2.下载dimens.xml并存放在values目录下
dimens.xml下载地址:https://download.csdn.net/download/duanchuanzhi/10544316
3.生成values-sw384dp~values-sw1365dp,生成步骤:
3.1.使用鼠标左键点击任意文件夹
3.2.点击ok
3.3.弹出Over, adapt successful提示表示生成成功,继续点击ok
生成成功之后会在res目录下生成对应文件夹
因为默认生成的是下列最小宽度dp的dimens.xml文件
384,392,400,410,411,480,533,592,600,640,662,720,768,800,811,820,960,961,1024,1280,1365,如果不需要或者需要增加某些dp值的dimens.xml文件,则需要修改配置文件,即screenMatch.properties文件(修改前先删除之前生成的全部dimens.xml文件)。配置文件在我们执行完成上面的命令后,会在项目的目录下自动生成,如下:
打开文件,修改需要适配384,392,400,410,411的值,不需要适配480,533,592,600,640,662,720,768,800,811,820,960,961,1024,1280,1365的值