安卓屏幕适配方案(根据今日头条方案,升级版)

前言

屏幕适配方案有很多,比如原生的dp,鸿洋大神的AutoLayout,宽高限定符,今天我用缺点比较小的今日头条方案

头条适配方案的文章链接:https://mp.weixin.qq.com/s/d9QCoBP6kV9VSWvVldVVwA

使用效果

测试后可以适配我身边的所有机型(其他的应该是都可以)

  • 设置Activity后Activity可以适配
  • 设置Activity后Activity内的Fragment可以适配
  • 设置Activity后Activity内的RecyclerView可以适配
  • 设置Activity后Activity弹出的Dialog可以适配

优缺点

优点:适配简单,无侵入,调用简单,未使用非官方api,不影响性能

缺点:基本可以通过骚操作来避免

使用方式

复制工具类

import android.app.Activity;
import android.util.DisplayMetrics;

/**
 * 创    建:  lt  2018/8/15--14:45
 * 作    用:  使用并优化今日头条的适配方案的工具类
 * 注意事项:  在Activity的onCreate里,并在setContextView之上调用,可以直接放在Base里
 */

public class FitUtil {
    private static float width = 750;//todo 手动设置为设计图的宽,适配将根据宽为基准,也可以设置高,但是推荐设置宽,如果不需要px=dp则不设置也行
    private static int dpi = 375;//todo 手动设置设计图的dpi,不知道可以设计图的宽除2测试一下
    private static float nativeWidth = 0;//真实屏幕的宽,不需要手动改

    /**
     * 在Activity的onCreate中调用,修改该Activity的density,即可完成适配,使用宽高直接使用设计图上px相等的dp值
     *
     * @param activity     需要改变的Activity
     * @param isPxEqualsDp 是否需要设置为设计图上的px直接在xml上写dp值(意思就是不需要自己计算dp值,直接写设计图上的px值,并改单位为dp),但开启后可能需要手动去设置ToolBar的大小,如果不用可以忽略
     */
    public static void autoFit(Activity activity, boolean isPxEqualsDp) {
        if (nativeWidth == 0) {
            nativeWidth = activity.getWindowManager().getDefaultDisplay().getWidth();
        }
        DisplayMetrics displayMetrics = activity.getResources().getDisplayMetrics();
        displayMetrics.density = isPxEqualsDp ? nativeWidth / dpi / (width / dpi) : nativeWidth / dpi;
        displayMetrics.densityDpi = (int) (displayMetrics.density * 160);
    }
}

在Activity的onCreate里,并在setContextView之上调用,可以直接放在Base里,比如:

public class BaseActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        FitUtil.autoFit(this,true);//this
    }
}

手动设置好UI给你的设计图的宽和dp(请查看注释自行计算)

然后就可以放心的使用了

需要注意方法的第二个参数

如果UI给你的图纸是按照dp为单位,就设置为false,然后页面上直接写相应的dp值就ok

如果UI给你的图纸是按照px为单位,就设置为true,然后页面上写对应的px值,但是单位写成dp,相当于直接从UI设计图上抄下来,很方便

某些可以避免的坑

  1. 字体的坑,字体可以通过修改scaledDensity属性来修改,不过为了防止用户调节字体导致字体显示不全,所以推荐使用dp,而不用去修改scaledDensity属性
  2. 设置了之后可能会有系统控件大小或者系统字体大小被更改,不过自己单独设置下就ok了
  3. 听说8.0手机无效,不过我在自己的8.0手机上可以(华为)
  4. 本方案对纯竖屏应用支持较好,若是纯横屏或横竖屏相交叉的话需要自行修改方法即可

转载请带上本文链接,然后点个赞

猜你喜欢

转载自blog.csdn.net/qq_33505109/article/details/81709021