屏幕适配方案终极版

今日头条屏幕适配方案终极版,一个极低成本的 Android 屏幕适配方案.

源码

 

Overview

Pixel 2 XL | 1440 x 2880 | 560dpi:

  

Pixel XL | 1440 x 2560 | 560dpi:

  

Nexus 5X | 1080 x 1920 | 420dpi:

  

Nexus 4 | 768 x 1280 | 320dpi:

  

Nexus S | 480 x 800 | 240dpi:

 

Notice

Download

 implementation 'me.jessyan:autosize:1.1.2'

Usage

Step 1 (真的不吹牛逼,只需要以下这一步,框架就可以对项目中的所有页面进行适配)

  • 请在 AndroidManifest 中填写全局设计图尺寸 (单位 dp),如果使用副单位,则可以直接填写像素尺寸,不需要再将像素转化为 dp,详情请查看 demo-subunits
<manifest>
    <application>            
        <meta-data
            android:name="design_width_in_dp"
            android:value="360"/>
        <meta-data
            android:name="design_height_in_dp"
            android:value="640"/>           
     </application>           
</manifest>

Preview

  • 布局时的实时预览在开发阶段是一个很重要的环节,很多情况下 Android Studio 提供的默认预览设备并不能完全展示我们的设计图,所以我们就需要自己创建模拟设备,下面就介绍下 dp、pt、in、mm 这四种单位的模拟设备创建方法

  • 如果您在预览时不希望在 Preview 中出现状态栏和导航栏, 则可以根据下图选择 panel 主题,使用该主题后纵向分辨率刚好填充整个预览页面,显示效果完全和设计图一致 

  • 为了方便广大新手,所以还是将创建模拟设备的步骤贴出来,为大家操碎了心,如果觉得 AndroidAutoSize 不错,请一定记得 star,并将 AndroidAutoSize 推荐给您的伙伴们 

DP

  • 如果您在 layout 文件中使用 dp 作为单位进行布局 (AndroidAutoSize 默认支持 dp、sp 进行布局),则可以根据公式 (sqrt(纵向分辨率^2+横向分辨率^2))/dpi 求出屏幕尺寸,然后创建模拟设备 (只用填写屏幕尺寸和分辨率

PT

 

  • 如果您在 layout 文件中使用 pt 作为单位进行布局 (需要通过 AutoSizeConfig.getInstance().getUnitsManager().setSupportSubunits(Subunits.PT); 打开对单位 pt 的支持),则可以根据公式 (sqrt(纵向分辨率^2+横向分辨率^2))/72 求出屏幕尺寸,然后创建模拟设备 (只用填写屏幕尺寸和分辨率

IN

  • 如果您在 layout 文件中使用 in 作为单位进行布局 (需要通过 AutoSizeConfig.getInstance().getUnitsManager().setSupportSubunits(Subunits.IN); 打开对单位 in 的支持),则可以根据公式 sqrt(纵向分辨率^2+横向分辨率^2) 求出屏幕尺寸,然后创建模拟设备 (只用填写屏幕尺寸和分辨率

MM

  • 如果您在 layout 文件中使用 mm 作为单位进行布局 (需要通过 AutoSizeConfig.getInstance().getUnitsManager().setSupportSubunits(Subunits.MM); 打开对单位 mm 的支持),则可以根据公式 (sqrt(纵向分辨率^2+横向分辨率^2))/25.4 求出屏幕尺寸,然后创建模拟设备 (只用填写屏幕尺寸和分辨率)

Advanced (以下用法看不懂?答应我,认真看 demo 好不好?)

Activity

  • 当某个 Activity 的设计图尺寸与在 AndroidManifest 中填写的全局设计图尺寸不同时,可以实现 CustomAdapt 接口扩展适配参数
public class CustomAdaptActivity extends AppCompatActivity implements CustomAdapt {

    @Override
    public boolean isBaseOnWidth() {
        return false;
    }

    @Override
    public float getSizeInDp() {
        return 667;
    }
}
  • 当某个 Activity 想放弃适配,请实现 CancelAdapt 接口
public class CancelAdaptActivity extends AppCompatActivity implements CancelAdapt {

}

Fragment

  • 首先开启支持 Fragment 自定义参数的功能
AutoSizeConfig.getInstance().setCustomFragment(true);
  • 当某个 Fragment 的设计图尺寸与在 AndroidManifest 中填写的全局设计图尺寸不同时,可以实现 CustomAdapt 接口扩展适配参数
public class CustomAdaptFragment extends Fragment implements CustomAdapt {

    @Override
    public boolean isBaseOnWidth() {
        return false;
    }

    @Override
    public float getSizeInDp() {
        return 667;
    }
}
  • 当某个 Fragment 想放弃适配,请实现 CancelAdapt 接口
public class CancelAdaptFragment extends Fragment implements CancelAdapt {

}

Subunits (请认真看 demo-subunits,里面有详细介绍)

  • 可以在 pt、in、mm 这三个冷门单位中,选择一个作为副单位,副单位是用于规避修改 DisplayMetrics#density 所造成的对于其他使用 dp 布局的系统控件或三方库控件的不良影响,使用副单位后可直接填写设计图上的像素尺寸,不需要再将像素转化为 dp
AutoSizeConfig.getInstance().getUnitsManager()
        .setSupportDP(false)
        .setSupportSP(false)
        .setSupportSubunits(Subunits.MM);

问题

1、两个不同方向的Activity切换时Fragment的适配问题 

(从一个横向的Activity(半屏显示一个Fragment)进入一个垂直方向的Activity后,再回退回来时,Fragment的字体、控件、间距都会变大了)

解决:

首先设置:版本 1.1.2
在承载Fragment的 activity,重写 Activity 的 getResources 方法,似乎就可以了,目前测试暂时没有复现

    override fun getResources(): Resources {
        //尝试解决屏幕横竖屏切换时适配失效的问题
        //如果没有自定义需求用这个方法
        AutoSizeCompat.autoConvertDensityOfGlobal((super.getResources()))
        return super.getResources()
    }

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值