美文网首页Android
Android 屏幕适配

Android 屏幕适配

作者: 假装门口当前台 | 来源:发表于2021-03-04 11:11 被阅读0次

    Android的屏幕大同小异,分辨率也是各种各样,手机App上的差异性还没那么明显,基本用Dp & weight就可以比较好的适配各种手机。但是在Pad上的表现就不尽如意,而且发现像华为Pad Pro这种高端设备,是可以通过系统设置去设置修改系统的density值,导致整个如果只用一套DpUI布局去实现,会出现很奇怪的UI效果,基本不能适配。这时候就需要对UI进行适配。通过资料查询,需要了解如下的几个概念

    1.px,pixel 就是像素,最基本的真实显示单位
    2.dp,dip, Density-independent pixel,设备的独立像素,1dp表示在屏幕像素点密度为160ppi时1px长度
    3.ppi, pixel per inch ,每英寸对角像素点,这个是物理上的
    4.dpi, dot per inch ,每英寸多少个点,这个是软件上的,这里的点跟像素点不同
    5.sp: scale-independent pixel, 字体大小单位

    简单换算就是
    ppi =根号( 横屏像素点平方+纵屏像素点平方)➗对角线的长度,这个长度是一英寸

    1dp = (dpi/160) px
    然后有些不同尺寸手机的ppi可能是420, 430, 440, 450, 460.,由于物理ppi上是固定的,改变不了,为了适配,通过人为设置一个dpi,来规范这些差不多ppi值,使得这些相差差不多的屏幕都是通用一个dpi,也就是使用同一套设计方案。
    一开始通过dp值来实现适配,是可以解决大部分适配问题,但是在遇到pad这种设备,由于是横屏,而且系统设置还可以修改density值,使得用一套固定屏幕(比如1280 * 800)的方向变得不是那么合适。

    这时候想到可以通过Android中 dimens中定义dimen值,Android中可以通过sw去搜索对应的dimen值表来获取对应的配置,smallestWidth适配,sw限定符适配,只要我们把对应的表通过换算,得到一个新值,就可以得到在不同的density值中得到对应的dp值表,解决华为上一个设备对应不同density值的问题。
    那么问题来了,如果去得到sw不同的dimens呢,网上的方法很多,有些自己写脚本,有些自己写程序生成,为了就是列举所有的值,一般1-1000dp,然后基于一个基准,比如360dp宽度,去换算出不同屏幕宽度的dimens值,这里我推荐Android Studio的插件ScreenMatch,先安装插件


    ScreenMatch安装

    然后在values中创建dimens文件夹,并创建dimens.xml,其中写上自己定义的dp值,如下

    <resources>
        <!-- dp and sp values, must be defind in this file! -->
        <!-- view size,you can add if there is no one -->
    
        <dimen name="dp_680">680dp</dimen>
        <dimen name="dp_449">449dp</dimen>
        <dimen name="dp_877">887dp</dimen>
    </resources>
    

    然后在该文件右键,选择screenmatch


    screenmatch使用

    插件就会生成一堆其他屏幕的dimens文件,并且自动生成1-800的其他dp值,基本满足开发中的定义,如果没有的话,就自行在这里定义,然后重新生成。
    关于ScreenMatch的生成还有一个基准,就是基于那个dpi来生成,通过插件生成,在根目录会多出了两个文件,一个example, 一个config文件


    生成的文件

    这里我们看看properties文件,内容如下

    ############################################################################
    # Start with '#' is annotate.                                              #
    # In front of '=' is key, cannot be modified.                              #
    # More information to visit:                                               #
    #   http://blog.csdn.net/fesdgasdgasdg/article/details/52325590            #
    #   http://download.csdn.net/detail/fesdgasdgasdg/9913744                  #
    #   https://github.com/mengzhinan/PhoneScreenMatch                         #
    ############################################################################
    #
    # You need to refresh or reopen the project every time you modify the configuration,
    # or you can't get the latest configuration parameters.
    #
    #############################################################################
    #
    # Base dp value for screen match. Cut the screen into [base_dp] parts.
    # Data type is double. System default value is 360.
    # I advise you not to modify the value, be careful !!!!!!!!! _^_  *_*
    base_dp=850
    # Also need to match the phone screen of [match_dp].
    # If you have another dp values.
    # System default values is 240,320,384,392,400,410,411,480,533,592,600,640,662,720,768,800,811,820,960,961,1024,1280,1365
    match_dp=
    # If you not wanna to match dp values above. Write some above values here, append value with "," .
    # For example: 811,961,1365
    ignore_dp=
    # They're not android module name. If has more��split with , Symbol.
    # If you set, it will not show in SelectDialog.
    # If you have, write here and append value with "," .
    # For example: testLibrary,commonModule
    # System default values is .gradle, gradle, .idea, build, .git
    ignore_module_name=
    # Use which module under the values/dimen.xml file to do the base file,
    # and generated dimen.xml file store in this module?
    # Default value is 'app'.
    match_module=pad
    # Don't show select dialog again when use this plugin.
    # System screen match will use the last selected module name or default module name.
    # You can give value true or false. Default value is false.
    not_show_dialog=false
    # Do you want to generate the default example dimens.xml file?
    # In path of .../projectName/screenMatch_example_dimens.xml, It does not affect your project code.
    # You can give value true or false. Default value is false.
    not_create_default_dimens=false
    # Does the font scale the same size as the DP? May not be accuracy.
    # You can give value true or false. Default value is true. Also need scaled.
    is_match_font_sp=true
    # Do you want to create values-wXXXdp folder or values-swXXXdp folder ?
    # I suggest you create values-swXXXdp folder,
    # because I had a problem when I was working on the horizontal screen adapter.
    # values-swXXXdp folder can solve my problem.
    # If you want create values-swXXXdp folder, set "create_values_sw_folder=true",
    # otherwise set "create_values_sw_folder=true".
    # Default values is true.
    create_values_sw_folder=true
    

    其中base_dp=850就是基于850,然后可以通过match_dp去调整要适配的dpi值。
    通过这方方式,会在dimens文件自动生成dimen文件


    image.png

    在网上看到,还可以通过修改density去修改,这种方式有空我在试试

    相关文章

      网友评论

        本文标题:Android 屏幕适配

        本文链接:https://www.haomeiwen.com/subject/yvihqltx.html