Android 让人头疼的屏幕适配方案
2018-07-02 本文已影响511人
副业小侦探
前言
作为一个Android Developer,Android的屏幕适配一直以来都在折磨着我们这些开发者,为什么会出现屏幕适配呢?
Android屏幕适配出现的原因
由于Android系统的开放性,任何用户、开发者、OEM厂商、运营商都可以对Android进行定制,修改成他们想要的样子。
但是这种“碎片化”到底到达什么程度呢?
在2012年,OpenSignalMaps(以下简称OSM)发布了第一份Android碎片化报告,统计数据表明,
2012年,支持Android的设备共有3997种。
2013年,支持Android的设备共有11868种。
2014年,支持Android的设备共有18796种。
下面这张图片所显示的内容足以充分说明当今Android系统碎片化问题的严重性,因为该图片中的每一个矩形都代表着一种Android设备。
suipian.png
适配方案
- dp适配
- px适配
- Autolayout
- 百分比适配
- ???
上面的几种方案作为开发者都已经了解和试用了,今天要讲的是由今日头条的大神们提出来的适配方案:(https://mp.weixin.qq.com/s/d9QCoBP6kV9VSWvVldVVwA)
直接上代码,试用了感觉还不错:
private static float appScaledDensity;
private static DisplayMetrics appDisplayMetrics;
public static void setDensity(@NonNull Application application) {
//获取application的DisplayMetrics
appDisplayMetrics = application.getResources().getDisplayMetrics();
if (appDensity == 0) {
//初始化的时候赋值
appDensity = appDisplayMetrics.density;
appScaledDensity = appDisplayMetrics.scaledDensity;
//添加字体变化的监听
application.registerComponentCallbacks(new ComponentCallbacks() {
@Override
public void onConfigurationChanged(Configuration newConfig) {
//字体改变后,将appScaledDensity重新赋值
if (newConfig != null && newConfig.fontScale > 0) {
appScaledDensity = application.getResources().getDisplayMetrics().scaledDensity;
}
}
@Override
public void onLowMemory() {
}
});
}
float targetScaledDensity = targetDensity * (appScaledDensity / appDensity);
int targetDensityDpi = (int) (160 * targetDensity);
/**
*
* 最后在这里将修改过后的值赋给系统参数
*
* 只修改Activity的density值
*/
DisplayMetrics activityDisplayMetrics = activity.getResources().getDisplayMetrics();
activityDisplayMetrics.density = targetDensity;
activityDisplayMetrics.scaledDensity = targetScaledDensity;
activityDisplayMetrics.densityDpi = targetDensityDpi;
}
使用方法
自己创建一个类,将代码复制粘贴就可以使用了
使用方法:在Application的onCreate()方法中
public class BaseApplication extends Application {
@Override
public void onCreate() {
super.onCreate();
Density.setDensity(this);
}
}
源码地址
打赏就不用了,扫码领个红包吧,互惠互利的操作。