分享两个方便Android屏幕适配的Python脚本

    (原创,转载请注明出处)

    在开发过程中,屏幕适配是一个让人头疼的问题,有很多时间都花在适配的问题上.一些的情况下,在不同dpi值的显示效果是一致的,屏幕适配就是直接进行数值的转换,例如hdpi->mdpi,所得的值就是hdpi的1.5倍.如果用手动转换写的话,基本上这是属于搬砖活,花再多的时间做这些事情是没什么意义的.于是为了偷懒,写了两个小脚本辅助自己工作,(之前是看过一篇介绍as下屏幕适配插件文章,但是找不到了).

    脚本环境Python3.6,其实原理很简单粗暴,第一个脚本直接生成字符串,第二个脚本就是直接进行数值的字符串替换.

    1.第一个脚本:生成字体大小列表,代码如下:

for i in range(11,71):
    print( ""+str(i)+"sp")
分享两个方便Android屏幕适配的Python脚本_第1张图片

一共就两行,简单吧?粗暴吧?这是生成在mdpi下的TextView字体大小值,在这里先只是生成,后面第二个脚本会进行转换.这里生成的值放在values-mdpi下就好.一部分生成结果如下:

分享两个方便Android屏幕适配的Python脚本_第2张图片

这只是第一步生成的,没什么好多说的.这里用第二个脚本进行转换之后作为例子:

mdpi下分享两个方便Android屏幕适配的Python脚本_第3张图片


hdpi下分享两个方便Android屏幕适配的Python脚本_第4张图片

这时候,在mdpi进行开发的时候,TextView的size直接用sp值就行了,例如直接引用@dimen/text_size_mdpi_21sp

等开发hdpi的屏幕的手机时候,直接就可以显示出等比适配的效果了


    2.屏幕密度数值转换脚本(我的文件命名为单位转换是不准确的,代码在文末)

    功能:将value文件下的dimen标签数值进行转换,例如有一行mdpi下的值:

name="too_bar_back_btn_h">30dp

转为hdpi

name="too_bar_back_btn_h">20dp

此脚本支持多行转换,并且会过滤注释.

    用法:1.在脚本同路径文件夹下创建文件"source.txt",然后将要转换的数值粘贴并保存,可粘贴dp值或者sp值,例如第一个脚本上生成的所有代码就可以放上去,然后保存.

            2.打开脚本,设定转换规则,在开头处对multiple进行赋值即可,转换倍数自己根据需要在代码处写,(各种dpi之间都可以)例如:

mdpi2hdpi = 160/240
mdpi2tvdpi = 160/213
#设置转换规则
multiple = mdpi2hdpi

此时就是将mdpi转为hdpi的值.

            3.run脚本,然后将打印的值放到相应文件夹下的value去就行了.


例子:

mdpi下的dimen值:分享两个方便Android屏幕适配的Python脚本_第5张图片


放到"source.txt"保存之后,运行一次脚本,然后把结果复制粘贴到hdpi下的value.xml文件去,结果如下:

分享两个方便Android屏幕适配的Python脚本_第6张图片

可见mdpi的数值刚好是hdpi的1.5倍.但是注释不会变. 可以根据自己的需要,改变到任何值.


文末代码处:

脚本1:

 #11sp

for i in range(11,71):
    print( ""+str(i)+"sp")

脚本2:

import os
import re

mdpi2hdpi = 160/240
mdpi2tvdpi = 160/213

#设置转换规则
multiple = mdpi2hdpi

path = os.getcwd()

file = open("source.txt" , encoding='utf-8')
all_text = ""
try:  
     all_text = file.read()
     #print( all_text )
finally:  
     file.close()  

lineSet = all_text.split("\n")

outPutSet = ""

for line in lineSet:
    if( "dimen" in line and ("dp" in line or "sp" in line ) ):#校验有效行,匹配dp和sp
        leftStart = line.index(">")#左边起始处
        rightStart = line.index("p")-1#右边起始处,-1是因为匹配了dp和sp
        #print(str(leftStart)+"  " +str(rightStart))
         
        dpSize = line[leftStart+1 : rightStart]#得出dp的数值
        dpSizeF = float( dpSize )#类型转换
        #print( dpSizeF )
        dpSizeF = dpSizeF * multiple
        #print( dpSizeF )

        leftStr = line[:leftStart+1]
        rightStr = line[rightStart:]

        outPutSet += leftStr + str("%.1f" % dpSizeF).replace(".0","") + rightStr +"\n"
        #替换 .0 为取整
    else :
        outPutSet += line + "\n" #不匹配,直接原文输出
print( outPutSet )


代码高亮截图:

分享两个方便Android屏幕适配的Python脚本_第7张图片

  

你可能感兴趣的:(android,python)