(原创,转载请注明出处)
在开发过程中,屏幕适配是一个让人头疼的问题,有很多时间都花在适配的问题上.一些的情况下,在不同dpi值的显示效果是一致的,屏幕适配就是直接进行数值的转换,例如hdpi->mdpi,所得的值就是hdpi的1.5倍.如果用手动转换写的话,基本上这是属于搬砖活,花再多的时间做这些事情是没什么意义的.于是为了偷懒,写了两个小脚本辅助自己工作,(之前是看过一篇介绍as下屏幕适配插件文章,但是找不到了).
脚本环境Python3.6,其实原理很简单粗暴,第一个脚本直接生成字符串,第二个脚本就是直接进行数值的字符串替换.
1.第一个脚本:生成字体大小列表,代码如下:
for i in range(11,71):
print( ""+str(i)+"sp ")
一共就两行,简单吧?粗暴吧?这是生成在mdpi下的TextView字体大小值,在这里先只是生成,后面第二个脚本会进行转换.这里生成的值放在values-mdpi下就好.一部分生成结果如下:
这只是第一步生成的,没什么好多说的.这里用第二个脚本进行转换之后作为例子:
这时候,在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去就行了.
例子:
放到"source.txt"保存之后,运行一次脚本,然后把结果复制粘贴到hdpi下的value.xml文件去,结果如下:
可见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 )
代码高亮截图: