问题来源:自己做了一个应用,UI发过来交互文档中的尺寸单位都是px,而google推荐dp,同时为了适配不同屏幕,需要从新计算,为了减少重复性工作,该脚本孕育而生。
实现方案:就是dimens.xml文件中写入UI交互文档大小,此时单位为px。通过遍历该文件,如果单位为px,就进行换算,如果是其他单位,如dp,就保持原来数值。关键就是px 与dp 换算,换算公式很简单,但是如何获取手机dpi 和文件夹命名就需要思考。本人采用adb 获取屏幕大小和dpi 信息,这样只要插入手机执行该脚本就能自动生成适配的values-xxx/dimens.xml文件,值得注意的地方是adb 获取屏幕大小,需要调换生成文件夹名。
注意:cmd 执行时,保存路径不要有中文

效果图:

GenerateDimensFile.py
#coding=utf-8
#author=ao.deng
import os
import subprocess
from xml.dom.minidom import Document
import xml.dom.minidom
import collections
import re
class GenerateDimensFile:def __init__(self):self.xmlStringdict = collections.OrderedDict()  # xml存储self.displaysSizeInfo=''self.nDipInfo=0def getCmdEexcuteResult(self,cmd):ps = subprocess.Popen(cmd, stdin=subprocess.PIPE, stdout=subprocess.PIPE, shell=True)data =ps.stdout.readlines()return datadef getInfoByADB(self):cmd ="adb shell dumpsys window displays"data =self.getCmdEexcuteResult(cmd)row=0;for item in data:item = item.decode("utf-8").strip(" ").strip("\r\n")if  item=='Display: mDisplayId=0':breakrow+=1needData=data[row+1]dataList=needData.decode("utf-8").split(" ")print(dataList)self.nDipInfo=int(dataList[5].replace("dpi",""))sizeInfo=dataList[6].replace("cur=","").split("x")self.displaysSizeInfo=sizeInfo[1]+"x"+sizeInfo[0]def px2dp(slef,px):dp=int(px/(slef.nDipInfo/160))return dpdef dp2px(slef,dp):px=int(dp*(slef.nDipInfo/160))return pxdef getXmlNodeValue(self, childNodes):value = ''for childNode in childNodes:if childNode.nodeName == '#text':value = value + childNode.wholeText# return childNode.wholeTextvalue_key = ''if childNode.nodeName != '#text' and childNode.nodeName != '#comment':attributeDict = childNode._attrsif attributeDict != None:for k, v in attributeDict.items():value_key = value_key + ' %s="%s" ' % (k, childNode.getAttribute(k))text = self.getXmlNodeValue(childNode.childNodes)# print (text)value = value + "<%s%s>%s</%s>" % (childNode.nodeName, value_key, text, childNode.nodeName)# print(value)return valuedef parse_xml_file(self, xml_fname):try:DOMTree = xml.dom.minidom.parse(xml_fname)collection = DOMTree.documentElementstringList = collection.getElementsByTagName("dimen")for string in stringList:if string.hasAttribute("name"):key = string.getAttribute("name")print("name: %s" % key)value = self.getXmlNodeValue(string.childNodes)print("value: %s" % value)self.xmlStringdict[key] = valuereturn Trueexcept Exception as e:print(e)return Falsedef build_xml_file(self,saveRootPath):if not os.path.exists(saveRootPath):os.mkdir(saveRootPath)if not os.path.exists(saveRootPath+"/"+"values-" + self.displaysSizeInfo):os.mkdir(saveRootPath+"/"+"values-" + self.displaysSizeInfo)try:impl = xml.dom.minidom.getDOMImplementation()doc = impl.createDocument(None, 'resources', None)resources = doc.documentElementfor key, value in self.xmlStringdict.items():if value[-2:]=="px":nValue=self.px2dp(int(value[:-2]))sVvalue ="%ddp"%nValue  #屏幕匹配else:sVvalue=valuestringele = doc.createElement("dimen")stringele.setAttribute("name", key)text = doc.createTextNode(sVvalue)stringele.appendChild(text)resources.appendChild(stringele)uglyXml = doc.toprettyxml(indent='    ', encoding='utf-8')uglyXml = str(uglyXml, encoding="utf8")if uglyXml:uglyXml = uglyXml.replace("&amp;", "&").replace("&lt;", "<"). \replace("&quot;", "\"").replace("&gt;", ">")text_re = re.compile('>\n\s+([^<>\s].*?)\n\s+</', re.DOTALL)prettyXml = text_re.sub('>\g<1></', uglyXml)print(prettyXml)self.xmlfd = open(os.path.join(saveRootPath+"/"+"values-" + self.displaysSizeInfo,"dimens.xml"), 'w', encoding='utf-8')# doc.writexml(self.xmlfd,addindent='  ',newl='\n',encoding="utf-8")self.xmlfd.write(prettyXml)self.xmlfd.close()print("xml生成成功")return "xml生成成功"except Exception as e:print(str(e))return "xml生成失败"if __name__=="__main__":mGenerateDimensFileHelper = GenerateDimensFile()mGenerateDimensFileHelper.getInfoByADB()mGenerateDimensFileHelper.parse_xml_file(r"E:\python_work\GenerateDimensFile\values\dimens.xml")mGenerateDimensFileHelper.build_xml_file(r"E:\python_work\GenerateDimensFile\values")

dimens文件生成器相关推荐

  1. 快速的CSV文件生成器

    介绍 在某些应用程序中,往往需要将数据库表中的数据取出来存为CSV文件.看起来是很容易的一件事情,但是如果要做到灵活,而且要在取大数据量的表时保证足够的性能,却需要认真考虑.本CSV文件生成器的设计考 ...

  2. 通过excel生成不同dimens文件来实现安卓屏幕适配

    在安卓项目中,对安卓市场上不同生产商和尺寸的手机实现屏幕适配一直是开发者比较闹心的问题,网上也有很多第三方适配方案来解决,在此不做多述.我们一般都是希望写一套布局文件,在屏幕纵横比相差不是非常大的情况 ...

  3. nixyx —— 一个小巧的项目工程/编译文件生成器(构建系统?)

    恩..nixyx确实算不上是一个构建系统. 所谓构建系统,比如GNU的Autotools,那是一套很完整的构建体系,包括了程序的配置,编译和安装三大部分. 类似的软件还有:google的gyp.腾讯的 ...

  4. 求泛微E-COLOGY9和EM7授权文件生成器

    求泛微E-COLOGY9和EM7授权文件生成器,好心人发一个420073353@qq.com

  5. [工具] alx 和 jad 文件生成器 BerryCreate 2.0 分享

    说明:经测试,的确很好的支持多个cod文件生成jad文件.小小缺憾:jad文件描述信息不能是中文. 转贴: 黑莓在线 [工具] alx 和 jad 文件生成器 BerryCreate 2.0 分享 很 ...

  6. java生成.h头文件_javah头文件生成器

    javah头文件生成器 javah程序创建C头文件和存根文件,这些是把本地C成员函数包入java 所需要的.被创建的头文件给出了有关java类的信息,这些信息是C成员函数与java类交换数据所必需的. ...

  7. android 屏幕适配dimens,关于android:安卓屏幕适配一键生成dimens文件

    工具类 import java.io.BufferedWriter; import java.io.File; import java.io.FileWriter; import java.io.Pr ...

  8. Hibernate映射文件生成器by LDDXFS

    本文由 http://www.cnblogs.com/LDDXFS/ 原创,转载请注明本文出处.(新版本的代码生成器写好了,新版本设计上更合理,会在近期对其进行相关介绍,打算在工作稳定后开源,本文为旧 ...

  9. 波形MIF文件生成器(C语言)

    写在前面:仅为个人代码/总结,未必标准,仅供参考!如有错误,还望指出交流,共同进步! 波形MIF文件生成代码 函数一.生成正弦波mif文件 /*-----功能:正弦波------*/ int sine ...

  10. Github标星5-3K原来还有如此丧心病狂的Android混淆文件生成器?

    将混淆文件导入到 proguard-rules.pro 同一目录下 编辑proguard-rules.pro,添加如下内容 -------------------------------------- ...

最新文章

  1. rsync - 远程同步工具
  2. 【1】青龙面板入门系列教程之服务器的选择及初始化
  3. [转]F# Samples 101 - Visual Studio 2010
  4. C++ 的多态性与虚函数
  5. react源码解读 {createClass}
  6. C/C++ 常见编程技巧!你学会了吗?
  7. 小米们要“造反”,开撕三大运营商
  8. 8备份sqlserver_关于SQL server 巡检的要点你都知道吗?
  9. 牙龈出血试试四个食疗方_新闻中心_新浪网
  10. js中几个对象的区别和用法
  11. ODrive踩坑(三)AS5047P磁编码器的ABI接口
  12. react 使用rewired_create-react-app 通过 react-app-rewired 添加 webpack 的 alias
  13. Android 微信分享信息
  14. Java的OOP编程思想
  15. Cron表达式 生成器
  16. 网站卡顿,推荐这些免费使用加速工具的网站
  17. 转录组测序day 1 基础知识
  18. linux jpg图片转base64,html中的图片直接使用base64编码后的字符串代替
  19. border边框部分不显示
  20. Android通过浏览器打开App并传递参数

热门文章

  1. mongodb lbs java_利用mongodb开发lbs应用实践
  2. 三菱plc232数据线驱动下载_程序怎么上传下载?以西门子S7-200PLC为例为你讲解
  3. Android或者是IOS/普通屏全面屏及qq浏览器和qq内置浏览器判断
  4. 应用层故事难讲 公链集体押注DeFi背后 是黔驴技穷的无奈之举?
  5. js中this指向的三种情况
  6. htm html mht 无图标,mht文件与html文件有何区别?
  7. excel2007/2010中独立显示窗体的方式
  8. 圆圈头像制作css,通过CSS3实现圆形头像显示
  9. educoder答案pythonnumpy_Educoder 题解
  10. 计算机用户名取名,重命名电脑用户名