参考:
Android屏幕适配(一):ScreenMatch官方屏幕适配方案
Carson带你学Android:屏幕适配-最全面的解决方案
切图应该放哪个 drawable 文件夹下
获取设备smallestWidthDP
DisplayMetrics dm = new DisplayMetrics();
getWindowManager().getDefaultDisplay().getMetrics(dm);
int heightPixels = dm.heightPixels;
int widthPixels = dm.widthPixels;
float density = dm.density;
float heightDP = heightPixels / density;
float widthDP = widthPixels / density;
float smallestWidthDP = Math.min(widthDP, heightDP);//411.42856
@Override
public void onWindowFocusChanged(boolean hasFocus) {
super.onWindowFocusChanged(hasFocus);
{
DisplayMetrics dm = new DisplayMetrics();
getWindowManager().getDefaultDisplay().getMetrics(dm);
int heightPixels = dm.heightPixels;
int widthPixels = dm.widthPixels;
float density = dm.density;
float densityDpi = dm.densityDpi;
float heightDP = heightPixels / density;
float widthDP = widthPixels / density;
float smallestWidthDP = Math.min(widthDP, heightDP);//411.42856
Log.e(TAG, "density====================" + density);
Log.e(TAG, "heightDP====================" + heightDP);
Log.e(TAG, "heightPixels====================" + heightPixels);
Log.e(TAG, "densityDpi====================" + densityDpi);
Log.e(TAG, "widthDP====================" + widthDP);
Log.e(TAG, "widthPixels====================" + widthPixels);
Log.e(TAG, "smallestWidthDP====================" + smallestWidthDP);
}
{
DisplayMetrics displayMetrics = getApplication().getResources().getDisplayMetrics();
float appDensity = displayMetrics.density;
float appScaleDensity = displayMetrics.scaledDensity;
float appDensityDpi = displayMetrics.densityDpi;
float appHeightPixels = displayMetrics.heightPixels;
float appWidthPixels = displayMetrics.widthPixels;
Log.e(TAG, "appDensity====================" + appDensity);
Log.e(TAG, "appScaleDensity====================" + appScaleDensity);
Log.e(TAG, "appDensityDpi====================" + appDensityDpi);
Log.e(TAG, "appHeightPixels====================" + appHeightPixels);
Log.e(TAG, "appWidthPixels====================" + appWidthPixels);
}
{
DisplayMetrics displayMetrics = getResources().getDisplayMetrics();
float activityDensity = displayMetrics.density;
float activityScaleDensity = displayMetrics.scaledDensity;
float activityDensityDpi = displayMetrics.densityDpi;
float activityHeightPixels = displayMetrics.heightPixels;
float activityWidthPixels = displayMetrics.widthPixels;
Log.e(TAG, "activityDensity====================" + activityDensity);
Log.e(TAG, "activityScaleDensity====================" + activityScaleDensity);
Log.e(TAG, "activityDensityDpi====================" + activityDensityDpi);
Log.e(TAG, "activityHeightPixels====================" + activityHeightPixels);
Log.e(TAG, "activityWidthPixels====================" + activityWidthPixels);
}
Configuration configuration = getResources().getConfiguration();
int smallestScreenWidthDp = configuration.smallestScreenWidthDp;
int screenWidthDp = configuration.screenWidthDp;
int screenHeightDp = configuration.screenHeightDp;
int densityDpi2 = configuration.densityDpi;
float density2 = getResources().getDisplayMetrics().density;
Log.e(TAG, "screenWidthDp====================" + screenWidthDp);
Log.e(TAG, "screenHeightDp====================" + screenHeightDp);
Log.e(TAG, "densityDpi2====================" + densityDpi2);
Log.e(TAG, "density2====================" + density2);
Log.e(TAG, "smallestScreenWidthDp=============================" + smallestScreenWidthDp);
// ========================================>分屏
// density====================1.5
// heightDP====================660.0
// heightPixels====================990
// densityDpi====================240.0
// widthDP====================1280.0
// widthPixels====================1920
// smallestWidthDP====================660.0
// screenWidthDp====================1280
// screenHeightDp====================604
// densityDpi2====================240
// density2====================1.5
// smallestScreenWidthDp=============================720
// ========================================>全屏
// density====================1.5
// heightDP====================660.0
// heightPixels====================990
// densityDpi====================240.0
// widthDP====================635.3333
// widthPixels====================953
// smallestWidthDP====================635.3333
// screenWidthDp====================635
// screenHeightDp====================604
// densityDpi2====================288
// density2====================1.8000001
// smallestScreenWidthDp=============================635
}
为什么选择 smallestWidth 限定符适配
而不用屏幕分辨率限定符适配
?
-
屏幕分辨率限定符适配
是根据屏幕分辨率
的,Android 设备分辨率一大堆,而且还要考虑虚拟键盘,这样就需要大量的 dimens.xml 文件。因为无论手机屏幕的像素多少,密度多少,90% 的手机的最小宽度都为 360dp,所以采用smallestWidth 限定符适配
只需要少量 dimens.xml 文件即可。 -
屏幕分辨率限定符适配
采用的是px
单位,而smallestWidth 限定符适配
采用的单位是dp
和sp
,dp 和 sp 是 google 推荐使用的计量单位。又由于很多应用要求字体大小随系统改变,所以字体单位使用 sp 也更灵活。 -
屏幕分辨率限定符适配
需要设备分辨率与 values-xx 文件夹完全匹配
才能达到适配,而smallestWidth 限定符适配
寻找 dimens.xml 文件的原理是从大往小
找,例如设备的最小宽度为 360dp,就会先去找 values-360dp,发现没有则会向下找 values-320dp,如果还是没有才找默认的 values 下的 demens.xml 文件,所以即使没有完全匹配也能达到不错的适配效果。
插件:ScreenMatch的使用:
ScreenMatch : 一种非常好用的Android屏幕适配
ScreenMatch : 一种非常好用的 Android 屏幕适配——smallestWidth 限定符适配
ScreenMatch 使用
- 获取设计图最小宽度(单位为 dp)。
- 以设计图最小宽度作为基准值,生成所有设备对应的 dimens.xml 文件。
如果项目只需要适配手机的话,只需要生成 320、360、362.2641、384、392.7272、400、410、411.4285、432、480 对应的 dimens.xml 文件即可。
- 根据设计图标注,标注多少 dp,布局中就写多少 dp,格式为 @dimen/dp_XX。
1、下载插件
2、找到下载的插件
3、点击使用:
4、成功后:
配置生成文件如下:360dp为设计图的尺寸
5、布局中:
针对设计图,多少就是多少dp/sp
最小宽度该填多少,一般根据ui出的图来填写dp值,一般宽度显示多少 dp 就写多少 dp, 多少 sp 就写多少 sp。