dimens_dimension - CSDN
精华内容
参与话题
  • Android完美适配dimens.xml脚本

    千次阅读 2019-08-03 16:50:12
    所以本人决定研究一下自动化适配的方法,于是乎从dimens文件入手。 什么是dimens文件这里就不详细阐述了,相信大家都知道,不知道的童鞋可以问度娘。 这里我先帮大家再巩固一下像素密度相关知识: 像素密度 ...

    相信大家都有适配的经历,而且面对大千世界千奇百怪的安卓手机,适配起来那叫一个蛋疼。所以本人决定研究一下自动化适配的方法,于是乎从dimens文件入手。
    什么是dimens文件这里就不详细阐述了,相信大家都知道,不知道的童鞋可以问度娘。
    这里我先帮大家再巩固一下像素密度相关知识:

    像素密度

    屏幕像素密度指单位长度屏幕显示的像素,即常说的dpi (dots per inch),每英寸点数。密度越高显示画面就越清晰。

    Android把像素密度按区间分成几种:

    分类 dpi
    ldpi 低密度
    mdpi 中密度
    hdpi 高密度
    xhdpi 超高密度
    xxhdpi 超超高密度
    xxxhdpi 超超超高密度

    在Android将mdpi即中密度作为基准线,即1dp= 1px;
    不同像素密度,系统给定了其对应比例和倍数如下:

    分类目录 ldpi mdpi hdpi xhdpi xxhdpi xxxhdpi
    密度(dpi) ~120 ~160 ~240 ~360 ~480 ~640
    图片比例 1.5 2 3 4 6 8
    倍数 0.75x 1x 1.5x 2x 3x 4x

    除了系统给定的像素密度还有一些并不是规范的屏幕,所以就需要我们自己去计算倍数。那么首先要得到像素密度:
    公式:根号下(长的平方+高的平方)➗屏幕尺寸
    这里写图片描述

    例如:

    600*1024的8寸屏幕 720*1280的8寸屏幕
    这里写图片描述 这里写图片描述

    他们之间的倍数关系是0.8倍。后面我们需要根据这个数值来进行适配。

    ok到这里,像素密度基本知识回顾的差不多了那么进入今天的正题。

    说了那么多无非就是用到最后的像素密度直接的倍数关系,那么今天要走的就是解放双手,不需要你手动去一个一个挨着计算dimens文件中的数值,而是采用脚本,帮你秒秒中完成。

    Python脚本

    这里提供两个方案:

    第一种是通过ElementTree获取节点,根据Key去改变value;

    第二种方案是通过/> 和< 符号来获取中间的数值,是因为dimens文件非常简单里面只有除了根节点外的dimen节点
    <dimen name="dp_10">10dp</dimen>

    第一种方案

    本方案需要使用到ElementTree,代码中注视已经详细介绍了使用方法,如果有想要详细了解的童鞋可以自行查看API,ElementTree API

    思路就是通过ElementTree获取到dimen节点,然后遍历得到对应的key和value,将value乘以设置好的倍数,然后再通过key写进去。
    ⚠️:这里用到了四舍五入,因为dimen文件不识别小数,会默认转成int,如果不使用四舍五入,假如计算后是1.9 ,那么写入dimens,会默认读到1,并不是1.9,所以应该四舍五入成2。

    代码

    # encoding=utf-8
    from xml.etree import ElementTree as ET
    import re
    
    # 转换倍数
    multiple = 0.9
    
    # 文件名
    fileName = "dimens.xml"
    
    '''''判断某个节点是否包含所有传入参数属性 
           node: 节点 
           kv_map: 属性及属性值组成的map'''
    def if_match(node, kv_map):
        for key in kv_map:
            if node.get(key) != kv_map.get(key):
                return False
        return True
    
    def get_node_by_keyvalue(nodelist, kv_map):
        '''''根据属性及属性值定位符合的节点,返回节点 
           nodelist: 节点列表 
           kv_map: 匹配属性及属性值map'''
        result_nodes = []
        for node in nodelist:
            if if_match(node, kv_map):
                result_nodes.append(node)
        return result_nodes
    
    def change_node_text(nodelist, text, is_add=False, is_delete=False):
        '''''改变/增加/删除一个节点的文本 
           nodelist:节点列表 
           text : 更新后的文本'''
        for node in nodelist:
            if is_add:
                node.text += text
            elif is_delete:
                node.text = ""
            else:
                node.text = text
    
    # 新数据写入文件 
    def writeValue(key,result,tree):
        nodes = tree.findall('dimen')
        result_nodes = get_node_by_keyvalue(nodes, {"name": key})
        change_node_text(result_nodes, str(result))
        tree.write(fileName)
    
    # 正则获取数字
    def showNumber(value_s):
        value = re.findall("\d+",value_s)
        return value[0]
    
    # 获取新数值
    def calculate(key,value,tree):
        ''' 获取原始数值'''
        value_org = showNumber(value)
        '''乘倍数'''
        result_cau = float(int(value_org) * float(multiple))
        ''' 四舍五入'''
        result_count = round(result_cau)
        ''' 正则替换原数据数值'''
        result = re.sub("\d+", str(result_count), value)
    
        writeValue(key,result,tree)
    
    # 遍历得到key--value
    def getValue(tree,root):
    
        for dimen in root.iter('dimen'):
            key = dimen.get('name')
            value = dimen.text
            calculate(key,value,tree)
    
    ''' 读取XML'''
    def readXml():
        tree = ET.parse('dimens.xml')
        root = tree.getroot()
    
        getValue(tree,root)
    
    if __name__ == "__main__":
        readXml()
    

    使用方法

    将dimens文件和python放在同一个目录下,更改你想要缩放的倍数,然后直接运行python文件就可以。

    第二种方案

    本方案是直接通过获取(’>’)和(’</’)中间的数值进行计算得到的,因为dimens没那么多复杂节点,除了根节点就是<dimen ></>
    这里没有使用四舍五入公式,而是在计算后的结果中加0.5转int,效果是一样的。

    start_i = s.find('>')
    end_i = s.find('</')#代码
    

    下面直接看代码

    import sys
    import io
    
    fileName = sys.argv[1]
    scale = sys.argv[2]
    
    result = ''
    
    
    def foo(s):
        start_i = s.find('>')
        end_i = s.find('</')
        value = int(int(s[start_i + 1: end_i - 2]) * float(scale) + 0.5)
        return "%s%d%s" % (s[: start_i + 1], value, s[end_i - 2:])
    
    
    with io.open(fileName, 'r', encoding='utf8') as file:
        for line in file:
            if '<dimen name="' not in line:
                result += line
            else:
                result += foo(line)
    
    with io.open("dimens_output.xml", 'w', encoding='utf8') as file:
        file.write(result)
    

    使用方法

    终端直接执行:

    python python文件 dimens.xml 所放的倍数

    python dimens.py dimens.xml 0.8
    

    总结

    这里只是给大家提供个思路和工具类,你也可以自己去用脚本实现。

    这里只要大家会使用就好了,脚本代码已经上传,童鞋们可以自行下载:
    http://download.csdn.net/detail/github_33304260/9915517

    python不懂的小伙伴可以自己找度娘学一学,或者自己使用其他脚本语言实现也可以,后期将推出AndroidStudio的插件,小伙伴可以敬请期待。

    扫码关注公众号“伟大程序猿的诞生“,更多干货新鲜文章等着你~

    公众号回复“资料获取”,获取更多干货哦~

    有问题添加本人微信号“fenghuokeji996” 或扫描博客导航栏本人二维码

    展开全文
  • dimens使用

    2018-10-11 14:45:01
    如上图,我将市面上各分辨率下的屏幕尺寸,取了平均数,算出对应的真实的屏幕像素密度,与理论要求的屏幕像素密度作了对比,比值在倒数第二列。...所以,dimens只需写两套即可(values-w320dp、va...

     

    这里写图片描述

    如上图,我将市面上各分辨率下的屏幕尺寸,取了平均数,算出对应的真实的屏幕像素密度,与理论要求的屏幕像素密度作了对比,比值在倒数第二列。发现:(干货要来了!)真实像素密度与理论像素密度的比值大致分为两类,取其平均数,一类在1.15左右,另一类则在0.89左右。巧了,它们两类正好各自对应w320dp和w360dp的宽度限定符!所以,dimens只需写两套即可(values-w320dp、values-w360dp),其name与真实数值的比值就是刚刚我们算出的两个平均数! 以后我们就不需要对应各种分辨率写多套dimens了,两套dimens即可。

    例如:在w320dp限定符下的dimens中,按照上表中求出的w320dp的比值平均数,将逻辑值转为实际值,name为理论值,后面对应真实值,在布局中按设计引用对应dimen值即可。

    这里写图片描述

     

    展开全文
  • dimens.xml详解

    千次阅读 2016-10-27 13:51:31
    Android中官方建议的屏幕适配方式,通过根据不同的分辨率在工程的res文件夹下建立不同的尺寸文件夹,每个文件夹下都建立dimens.xml文件。然后根据不同的尺寸在dimens.xml文件夹中分别计算配置不同的d

    本文联合两篇博文和自身理解写下
    其中一篇:http://blog.csdn.net/hnzcdy/article/details/50628993
    另一篇:暂不知原作者
    Android中官方建议的屏幕适配方式,通过根据不同的分辨率在工程的res文件夹下建立不同的尺寸文件夹,每个文件夹下都建立dimens.xml文件。然后根据不同的尺寸在dimens.xml文件夹中分别计算配置不同的dp或者sp单位。开发中发现,android屏幕适配需要用到很多的尺寸,每个尺寸都建立dimens.xml问价。每个文件中的数值都要按照比例去计算,一个一个拿着计算器去计算吗?这样太麻烦了。今天有一个好的办法,来为大家介绍一下。

     一、首先我们在工程的res文件夹下,建立不同尺寸的valuse配置文件夹。并在不同的文件夹下建立不同的dimens.xml文件。valuse为默认的工程配置,其余的为根据不同的尺寸适配用户自己新建。(这里以android studio 1.5为示例)
    

    展示
    二、 最初在res / values / dimensional.xml中定义的维度的示例自定义(如屏幕边距)用于具有超过820dp可用宽度的屏幕。 这个
    将包括在景观中的7“和10”设备(分别〜960dp和〜1280dp)

    <?xml version="1.0" encoding="utf-8"?> 
    
    <LinearLayout xmlns:Android="http://schemas.android.com/apk/res/android" android:orientation="vertical"
    
    android:layout_width="fill_parent" 
    
    android:layout_height="fill_parent"> 
    
    <TextView 
    
    android:text="@string/test_dimen" 
    
    android:id="@+id/myDimenTextView01" 
    
    android:layout_width="wrap_content" 
    
    android:layout_height="wrap_content" 
    
    android:width="@dimen/text_width" 
    
    android:height="@dimen/text_height" 
    
    android:background="@color/red_bg" /> 
    
    <Button 
    
    android:text="@string/test_dimen1" 
    
    android:id="@+id/Button01" 
    
    android:layout_width="wrap_content" 
    
    android:layout_height="wrap_content">
    
    </Button>  
    
    </LinearLayout>
    Java代码:
    package yy.android.dimen;  
    
    import android.app.Activity; 
    
    import android.content.res.Resources; 
    
    import android.os.Bundle; 
    
    import android.widget.Button; 
    
    import com.amaker.test.R; 
    
    public class TestDimensionActivity extends Activity {
    
    private Button myButton; 
    
    @Override 
    
    public void onCreate(Bundle savedInstanceState) {
    
    super.onCreate(savedInstanceState); 
    
    // 设置当前Activity的内容布局视图 
    
    setContentView(R.layout.test_dimen); 
    
    // 通过findViewById方法获得Button实例 
    
    myButton = (Button)findViewById(R.id.Button01); 
    
    // 获得Resources 实例 
    
    Resources r = getResources(); 
    
    // 通过getDimension方法获得尺寸值 
    
    float btn_h = r.getDimension(R.dimen.btn_height);
    
    float btn_w = r.getDimension(R.dimen.btn_width);
    
    // 设置按钮的宽 
    
    myButton.setHeight((int)btn_h); 
    
    // 设置按钮的高 
    
    myButton.setWidth((int)btn_w); 
    
    }  
    
    }
    展开全文
  • Android 屏幕适配之 dimens 适配

    千次阅读 2019-01-18 16:00:33
      1 参考链接 ... 首先需要明白一些概念,比如什么是 px,什么是 dp,什么是 dpi,讲这些概念的文章很多,推荐一个: http://www.jianshu.com/p/ec5a1a30694b ...Google 官方推荐在写布局文件的时候使用...

     

     

    1 参考链接

    http://blog.csdn.net/qq_34161388/article/details/73469319

    首先需要明白一些概念,比如什么是 px,什么是 dp,什么是 dpi,讲这些概念的文章很多,推荐一个:

    http://www.jianshu.com/p/ec5a1a30694b

     

    2 为什么要适配

    Google 官方推荐在写布局文件的时候使用 dp,在分辨率相差不大的情况下,dp 确实能自己进行一定适配,但是如果分辨率比较大的时候,还是会有问题,所以仍然需要适配。而且如果不是大公司的话,UI 设计图通常都是以 iOS 为标准分辨率的,这让我们 Android 写起布局来还是挺不顺手的。对于适配这个问题,网上众说纷纭,以前虽然有零零散散的看过,但是没有实践过,也是在最近遇到这个需求的情况下才研究了一下,现在做个记录。

     

    2.1 情况一

    <?xml version="1.0" encoding="utf-8"?>
    <RelativeLayout
        xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:app="http://schemas.android.com/apk/res-auto"
        xmlns:tools="http://schemas.android.com/tools"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        tools:context=".MainActivity">
    
        <ImageView
            android:layout_width="200dp"
            android:layout_height="200dp"
            android:layout_marginLeft="150dp"
            android:layout_marginStart="150dp"
            android:layout_marginTop="250dp"
            android:src="@mipmap/ic_launcher"/>
    
    </RelativeLayout>

     

    上面是随便写的一个布局,就在 RelativeLayout 中放了一个 ImageView,ImageView 左边和顶部给了一定 margin,运行一下看看效果:

                

     

    从左到右分别是 800x480、1920x1080、2560x1440 的分辨率的手机上的效果,可以从 ImageView 右边和底部与手机屏幕的距离很明显的看出来差异。

     

    2.2 情况二

    <?xml version="1.0" encoding="utf-8"?>
    <RelativeLayout
        xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:app="http://schemas.android.com/apk/res-auto"
        xmlns:tools="http://schemas.android.com/tools"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        tools:context=".MainActivity">
    
        <HorizontalScrollView
            android:id="@+id/horizontal_scroll_view"
            android:layout_width="wrap_content"
            android:layout_height="50dp">
    
            <LinearLayout
                android:layout_width="wrap_content"
                android:layout_height="match_parent"
                android:orientation="horizontal">
    
                <TextView
                    android:layout_width="90dp"
                    android:layout_height="match_parent"
                    android:background="#FFFF0000"
                    android:gravity="center"
                    android:text="第一个"
                    android:textColor="#FF000000"
                    android:textSize="18sp"/>
    
                <TextView
                    android:layout_width="90dp"
                    android:layout_height="match_parent"
                    android:background="#FFFFFF00"
                    android:gravity="center"
                    android:text="第二个"
                    android:textColor="#FF000000"
                    android:textSize="18sp"/>
    
                <TextView
                    android:layout_width="90dp"
                    android:layout_height="match_parent"
                    android:background="#FF00FF00"
                    android:gravity="center"
                    android:text="第三个"
                    android:textColor="#FF000000"
                    android:textSize="18sp"/>
    
                <TextView
                    android:layout_width="90dp"
                    android:layout_height="match_parent"
                    android:background="#FF00FFFF"
                    android:gravity="center"
                    android:text="第四个"
                    android:textColor="#FF000000"
                    android:textSize="18sp"/>
            </LinearLayout>
        </HorizontalScrollView>
    </RelativeLayout>

     

    这是在一个 HorizontalScrollView 中放置了一个 LinearLayout,里面放置了 4 个 TextView,给了固定宽度为  90dp,运行一下看看效果:

              

     

    从左到右仍然是 800x480、1920x1080、2560x1440,这下区别更明显,800x480 已经装不下这 4 个 TextView 了,1920x1080 则是刚好平分,2560x1440 则还有富余。

    现在我在项目中遇到的情况就是情况二,在 HorizontalScrollView 中需要放置几个 TextView,每个 TextView 的宽度需要刚好为屏幕的 1./4。其实不适配也可以做,就是在 Activity 中使用 Java 代码获取屏幕宽度,动态修改每个 TextView 的宽度。不过这样的代码,写出来还是有点恶心的:

            HorizontalScrollView horizontalScrollView = findViewById(R.id.horizontal_scroll_view);
            LinearLayout linearLayout = (LinearLayout) horizontalScrollView.getChildAt(0);
            for (int i = 0; i < linearLayout.getChildCount(); i++) {
                linearLayout.getChildAt(i).getLayoutParams().width = getResources().getDisplayMetrics().widthPixels / 4;
                linearLayout.getChildAt(i).requestLayout();
            }

     

    3 适配

    针对上面这两种情况,我们就应该考虑适配了,适配的方式有很多,比如鸿洋大神的 AutoLayout(已经停止维护了,不建议在项目中使用),还有写多个 layout 布局呀,还有 dimens 适配呀等等,在对比了多种方法后,最后我采用了 dimens 适配这种方式。这样的适配方式虽然会加入很多不同分辨率的 dimens 文件,但是比起写多个 layout 布局,要修改 UI 的时候需要修改很多 layout 的情况,还是要方便一点,最主要的是写布局的时候会更方便!

    首先我们要建立多个不同分辨率的 values 文件夹,主流的分辨率有:values-800x480、values-1280x720、values-1920x1080、values-2560x1440,而在 Android 中是以 480x320 为基准的,所以这个分辨率的 dimens 文件可以放到默认的 values 文件夹下,最后的文件夹结构如下:

     

    每个文件夹下放置一个 dimens.xml 文件,dimens 中的值是按照基准分辨率进行等比例扩大或缩小的,如 480x320 的分辨率作为基准分辨率,那么 values 下的 dimens.xml 文件内容就应该是这样:

    <?pxml version="1.0" encoding="utf-8"?>
    <resources>
        <dimen name="px1">1px</dimen>
        <dimen name="px2">2px</dimen>
        <dimen name="px3">3px</dimen>
        <dimen name="px4">4px</dimen>
        ......
        <dimen name="px1397">1397px</dimen>
        <dimen name="px1398">1398px</dimen>
        <dimen name="px1399">1399px</dimen>
        <dimen name="px1400">1400px</dimen>
    
    </resources>
    

     

    values-1280x720 文件夹下面的 dimens.xml 文件中的内容就应该是这样的:

    <?pxml version="1.0" encoding="utf-8"?>
    <resources>
        <dimen name="px1">2.25px</dimen>
        <dimen name="px2">4.5px</dimen>
        <dimen name="px3">6.75px</dimen>
        <dimen name="px4">9px</dimen>
        ......
        <dimen name="px1397">3143.25px</dimen>
        <dimen name="px1398">3145.5px</dimen>
        <dimen name="px1399">3147.75px</dimen>
        <dimen name="px1400">3150px</dimen>
    
    </resources>
    

     

    values-1920x1080 文件夹下面的 dimens.xml 文件中的内容就应该是这样的:

    <?pxml version="1.0" encoding="utf-8"?>
    <resources>
        <dimen name="px1">3.375px</dimen>
        <dimen name="px2">6.75px</dimen>
        <dimen name="px3">10.125px</dimen>
        <dimen name="px4">13.5px</dimen>
        ......
        <dimen name="px1397">4714.875px</dimen>
        <dimen name="px1398">4718.25px</dimen>
        <dimen name="px1399">4721.625px</dimen>
        <dimen name="px1400">4725px</dimen>
    
    </resources>
    

     

    你没看错,就是 px,这样我们可以直接用 px 来写布局文件了,而不用对着设计图将 px换算成 dp 了。而且既然可以将 480x320 的分辨率作为基准,那么同样也可以以我们的设计图的分辨率作为基准,比如我拿到的设计图是 720x1080 分辨率的,那么我们就可以以 1280x720 作为基准,480x320 的等比例缩小:

    <?xml version="1.0" encoding="utf-8"?>
    <resources>
        <dimen name="px1">0.4444444px</dimen>
        <dimen name="px2">0.8888889px</dimen>
        <dimen name="px3">1.333333px</dimen>
        <dimen name="px4">1.777778px</dimen>
    	......
        <dimen name="px1397">620.8889px</dimen>
        <dimen name="px1398">621.3333px</dimen>
        <dimen name="px1399">621.7778px</dimen>
        <dimen name="px1400">622.2222px</dimen>
    
    </resources>

     

    1920x1080 等比例扩大:

    <?xml version="1.0" encoding="utf-8"?>
    <resources>
        <dimen name="px1">1.5px</dimen>
        <dimen name="px2">3px</dimen>
        <dimen name="px3">4.5px</dimen>
        <dimen name="px4">6px</dimen>
        ......
        <dimen name="px1397">2095.5px</dimen>
        <dimen name="px1398">2097px</dimen>
        <dimen name="px1399">2098.5px</dimen>
        <dimen name="px1400">2100px</dimen>
    
    </resources>

     

    这样适配后,再来对上面两种情况修改布局(以 720x1280 为基准分辨率,在 720x1280 分辨率下,1dp=2px):

    <?xml version="1.0" encoding="utf-8"?>
    <RelativeLayout
        xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:app="http://schemas.android.com/apk/res-auto"
        xmlns:tools="http://schemas.android.com/tools"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        tools:context=".MainActivity">
    
        <ImageView
            android:id="@+id/image_view"
            android:layout_width="@dimen/px400"
            android:layout_height="@dimen/px400"
            android:layout_marginLeft="@dimen/px300"
            android:layout_marginStart="@dimen/px300"
            android:layout_marginTop="@dimen/px500"
            android:src="@mipmap/ic_launcher"/>
    
    </RelativeLayout>

     

              

     

    <?xml version="1.0" encoding="utf-8"?>
    <RelativeLayout
        xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:app="http://schemas.android.com/apk/res-auto"
        xmlns:tools="http://schemas.android.com/tools"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        tools:context=".MainActivity">
    
        <HorizontalScrollView
            android:id="@+id/horizontal_scroll_view"
            android:layout_width="wrap_content"
            android:layout_height="@dimen/px100">
    
            <LinearLayout
                android:layout_width="wrap_content"
                android:layout_height="match_parent"
                android:orientation="horizontal">
    
                <TextView
                    android:layout_width="@dimen/px180"
                    android:layout_height="match_parent"
                    android:background="#FFFF0000"
                    android:gravity="center"
                    android:text="第一个"
                    android:textColor="#FF000000"
                    android:textSize="18sp"/>
    
                <TextView
                    android:layout_width="@dimen/px180"
                    android:layout_height="match_parent"
                    android:background="#FFFFFF00"
                    android:gravity="center"
                    android:text="第二个"
                    android:textColor="#FF000000"
                    android:textSize="18sp"/>
    
                <TextView
                    android:layout_width="@dimen/px180"
                    android:layout_height="match_parent"
                    android:background="#FF00FF00"
                    android:gravity="center"
                    android:text="第三个"
                    android:textColor="#FF000000"
                    android:textSize="18sp"/>
    
                <TextView
                    android:layout_width="@dimen/px180"
                    android:layout_height="match_parent"
                    android:background="#FF00FFFF"
                    android:gravity="center"
                    android:text="第四个"
                    android:textColor="#FF000000"
                    android:textSize="18sp"/>
            </LinearLayout>
        </HorizontalScrollView>
    </RelativeLayout>

     

              

     

    4 特殊适配

    在上面的 values 文件夹结构示意图中会有那么两个奇怪的分辨率,1720x1080 和 2360x1440,这个分辨率的手机应该是没有的,那么为什么要写这么两个奇怪的分辨率呢,里面的文件每一个 px 的值应该是多少呢?

    先来说一种情况。有的手机是有虚拟按键的,比如 Nexus、华为,这些有虚拟按键的手机分辨率是将虚拟按键的高度算进去了的,但是 Android 在对 values 适配的时候却不会将虚拟按键的高度算进去,比如一个手机的分辨率本来是 1920x1080,但是虚拟按键栏占了144,所以它在适配的时候并不会去找 1920x1080 这个分辨率,而是去找 values-1776-1080,要是这个分辨率没有,那么就会去找低一级的分辨率 1280x720,再没有就再找更低一级的。所以布局又会出问题了,怎么办呢?其实虚拟按键栏的高度我们是可以获取的:

        /**
         * Description:获取虚拟按键栏高度
         * Date:2018/8/1
         */
        public static int getNavigationBarHeight(Context context) {
            int result = 0;
            if (hasNavBar(context)) {
                Resources res = context.getResources();
                int resourceId = res.getIdentifier("navigation_bar_height", "dimen", "android");
                if (resourceId > 0) {
                    result = res.getDimensionPixelSize(resourceId);
                }
            }
            return result;
        }
    
        /**
         * Description:检查是否存在虚拟按键栏
         * Date:2018/8/1
         */
        @TargetApi(Build.VERSION_CODES.ICE_CREAM_SANDWICH)
        public static boolean hasNavBar(Context context) {
            Resources res = context.getResources();
            int resourceId = res.getIdentifier("config_showNavigationBar", "bool", "android");
            if (resourceId != 0) {
                boolean hasNav = res.getBoolean(resourceId);
                // check override flag
                String sNavBarOverride = getNavBarOverride();
                if ("1".equals(sNavBarOverride)) {
                    hasNav = false;
                } else if ("0".equals(sNavBarOverride)) {
                    hasNav = true;
                }
                return hasNav;
            } else { // fallback
                return !ViewConfiguration.get(context).hasPermanentMenuKey();
            }
        }

     

    在得到虚拟按键栏的高度后,如为 144,再用分辨率去减这个高度,如 1920-144=1776,那么我们再增加一个 values-1776x1080 文件夹,里面的 dimens.xml 文件同 1920x1080 即可。但是不同手机的虚拟按键的高度也可能是不一样的,不可能写 values-1776x1080、values-1780x1080 这么多文件夹,上面说了找不到这个分辨率的时候,就会去找低一级的分辨率,所以我们写一个最低的就行了,比如 1720x1080,那么 1776x1080、1780x1080 等都会去找 1720x1080 了。

    所以就多了 1720x1080 和 2360x1440 这两个文件夹,1720x1080 与 1920x1080 是一样的,2360x1440 则与 2560x1440 是一样的,把高写小了 200 就是为了尽可能的适配有虚拟按键栏的手机。

     

    5 Dimens 文件生成器

    但是这么多 dimens 文件不可能手写,推荐一个 dimens 文件自动生成器,已上传资源:

    Dimens 文件生成器

    使用方法:

     

    其中 Dpi 一定要选择 160,最后生成的文件的值后面是 dp,全局替换成 px 就好。如果是以 iPhone6 的设计图 750x1334 为基准分辨率的话,比例会有点误差 Height 要写成1333.3333。

     

    6 总结

    屏幕适配其实说麻烦也麻烦,说简单也简单,麻烦是因为文件太多,简单是因为步骤固定,这也就是我为什么选择用 dimens 适配的原因,生成一下 dimens 文件的麻烦程度我还是可以接受的,只要将正确的 dimens 文件放到工程中,后面也就不用考虑其他的了。

    展开全文
  • 在过去多个项目中一直使用dimens适配,这种适配方式的优点很明显,不用管什么dp还是dpi这些东西,只需要以一种屏幕分辨率为基准(例如1280x720,相当于把屏幕宽分成720份,高分成1280份),生成对应屏幕分辨率的的dimens文件...
  • dimens

    2015-03-12 16:14:53
    实google在分辨率适应性的东西已经写的很清楚了,只是我们很多人没去看而已  以下是结论:  屏幕分辨率:1024x600  density:1(160)  文件夹:values-mdpi-1024x600 ... 文件夹:values-hdpi-683x400 由...
  • Android 屏幕适配之dimens适配

    万次阅读 热门讨论 2018-03-01 09:39:20
    在过去多个项目中一直使用dimens适配,这种适配方式的优点很明显,不用管什么dp还是dpi这些东西,只需要以一种屏幕分辨率为基准(例如1280x720,相当于把屏幕宽分成720份,高分成1280份),生成对应屏幕分辨率的的dimens文件...
  • public class AndroidValuesDpXml { private final static String rootPath = "C:\\layoutvalues\\values-sw{0}dp\\"; private final static String WTemplate = "<dimen name=\"webdemen_{0}\">...
  • 关于dimens适配的好处和方法,我就不介绍了,请点击:android各版本分辨率适配(项目亲测)本文重点说下,当遇到文中提供的dimens文件没有的分辨率如何去添加,比如(新分辨率)新机发布。第一步:下载文件,解压到D盘...
  • Android屏幕适配---dimens转换工具

    千次阅读 2015-08-04 16:56:17
    Android屏幕适配---dimens转换工具的使用 分辨率的学习博客:http://blog.csdn.net/pcaxb/article/details/46773017 第一步:解压之后里面有一个dimens.xml模板和一个exe文件,该dimens.xml可以按照自己的需要...
  • android屏幕适配,自动生成不同的dimens.xml详解

    万次阅读 多人点赞 2017-12-09 08:48:05
    android中官方建议的屏幕适配方式,通过根据不同的分辨率在工程的res文件夹下建立不同的尺寸文件夹,每个文件夹下都建立dimens.xml文件。然后根据不同的尺寸在dimens.xml文件夹中分别计算配置不同的dp或者sp单位。...
  • 介绍如何在dimens.xml保存不带单位的数值,如整数和浮点数
  • 获取dimens值问题

    千次阅读 2014-06-06 11:57:55
    在开发过程中,遇到的一个关于不同屏幕资源地
  • android studio 快速生成dimens文件

    千次阅读 2018-08-09 10:18:16
    创建一个类运行下,快速生成你需要的dimens文件中的数据,解放你每次需要每次添加一个。 第一步创建一个类:TestDimenTool(注意文件路径需要写对),要编写sp、px单位的更改end字符串中的后缀; public class ...
  • 自动生成dimens.xml文件方式 优势:在默认values下调一种分辨率的dimens.xml文件 然后利用工具自动生成其他分辨率下的dimens.xml文件(就是整体放大或缩小多少倍)  可以快速粗略的做到适配多分辨率 至于我天朝的...
  • Android如何在代码中设置dimen值

    万次阅读 2017-01-05 14:51:39
    在xml布局文件中这只dimens值大家应该都用的hen6了,但是有的时候必须要在代码中设置某一个控件的宽高等, 使用 getResources().getDimensionPixelSize(R.dimen.dp472px);就可以得到dimen的值
  • 在利用dimens.xml进行android设备适配的时候,在xml中我们不能直接定义写死的各个dp,px,sp等。应该使用@dimens/*******的方法,根据android设备的dpi和分辨率来获取不同文件夹中的dimens.xml文件。 而各个...
  • 30sp btn.setTextSize(TypedValue.COMPLEX_UNIT_SP, (int) (getResources().getDimension(R.dimen.BtnTextSize) / getResources().getDisplayMetrics().density)); 注意在getDimension()之后要除以屏幕的dpi...
  • 一个好的App必须要支持绝大多数市面上的设备,适配繁多的分辨率一度让我们陷入了分辨率的海洋。无论如何,这个工作是逃不掉的。我们可以用多个layout目录对不同分辨率进行单独布局,如下:layout-large-mdpi (1024...
  • 打造AS酷炫dimens适配插件

    千次阅读 2019-08-03 16:41:06
    书接上文 Android完美适配dimens.xml脚本后,今天给大家带来了本人最新开发的dimens适配插件。 接下来给大家介绍一下插件的基本使用,非常简单。 脚本下载地址 使用 一、安装插件 1.选择Preferences 2....
1 2 3 4 5 ... 20
收藏数 7,536
精华内容 3,014
关键字:

dimens