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

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

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

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

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

for i in range(11,71):
    print( "<dimen name=\"text_size_mdpi_"+str(i)+"sp\">"+str(i)+"sp</dimen>")

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


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

mdpi下


hdpi下

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

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


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

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

<dimen name="too_bar_back_btn_h">30dp</dimen>

转为hdpi

<dimen name="too_bar_back_btn_h">20dp</dimen>

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

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

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

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

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

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


例子:

mdpi下的dimen值:


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


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


文末代码处:

脚本1:

 #<dimen name="text_size_mdpi_11sp">11sp</dimen>

for i in range(11,71):
    print( "<dimen name=\"text_size_mdpi_"+str(i)+"sp\">"+str(i)+"sp</dimen>")

脚本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</dimen>")-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 )


代码高亮截图:


  

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值