Android开发程序猿开发笔记程序媛开发笔记

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

适配方案

  1. dp适配
  2. px适配
  3. Autolayout
  4. 百分比适配
  5. ???
    上面的几种方案作为开发者都已经了解和试用了,今天要讲的是由今日头条的大神们提出来的适配方案:(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);
  }
}

源码地址
打赏就不用了,扫码领个红包吧,互惠互利的操作。

1530497202477.jpg
上一篇下一篇

猜你喜欢

热点阅读