Android完美适配dimens.xml脚本
来源:互联网 发布:ubuntu 删除文件命令 编辑:程序博客网 时间:2024/06/16 16:33
相信大家都有适配的经历,而且面对大千世界千奇百怪的安卓手机,适配起来那叫一个蛋疼。所以本人决定研究一下自动化适配的方法,于是乎从dimens文件入手。
什么是dimens文件这里就不详细阐述了,相信大家都知道,不知道的童鞋可以问度娘。
这里我先帮大家再巩固一下像素密度相关知识:
像素密度
屏幕像素密度指单位长度屏幕显示的像素,即常说的dpi (dots per inch),每英寸点数。密度越高显示画面就越清晰。
Android把像素密度按区间分成几种:
在Android将mdpi即中密度作为基准线,即1dp= 1px;
不同像素密度,系统给定了其对应比例和倍数如下:
除了系统给定的像素密度还有一些并不是规范的屏幕,所以就需要我们自己去计算倍数。那么首先要得到像素密度:
公式:根号下(长的平方+高的平方)➗屏幕尺寸
例如:
他们之间的倍数关系是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-8from xml.etree import ElementTree as ETimport 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 Truedef 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_nodesdef 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--valuedef 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文件就可以。
第二种方案
本方案是直接通过获取(‘>’)和(‘
start_i = s.find('>')end_i = s.find('</')#代码
下面直接看代码
import sysimport iofileName = 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的插件,小伙伴可以敬请期待。
有不懂的可以扫描左侧二维码加入群聊。
- Android完美适配dimens.xml脚本
- Android利用dimens.xml进行适配,使用代码生成不同的dimens.xml文件
- Android利用dimens.xml进行适配,使用代码生成不同的dimens.xml文件
- Android利用dimens.xml进行适配,使用代码生成不同的dimens.xml文件
- 自动生成Android屏幕适配的dimens.xml
- 自动生成android dimens.xml适配屏幕
- 自动生成Android屏幕适配的dimens.xml
- android dimens.xml用法
- android适配dimens.xml
- android之屏幕适配(三)实践dimens.xml尺寸适配不同的平板
- android之屏幕适配,实践dimens.xml尺寸适配不同的平板
- 自动生成Android屏幕适配的dimens.xml文件工具类
- android屏幕适配,自动生成不同的dimens.xml详解
- Android快速屏幕尺寸适配 快速生成 res/dimens.xml
- android屏幕适配,自动生成不同的dimens.xml详解
- android屏幕适配,自动生成不同的dimens.xml详解
- Android屏幕适配---dimens转换工具
- android屏幕适配之dimens适配
- ProgressBar
- 关于windows家庭版vmware虚拟网卡没有导致的虚拟机无法连接成功网络问题
- HTML5基本格式
- HDU1548 奇怪的电梯 最短路 spfa bfs
- UE4之HTTP请求
- Android完美适配dimens.xml脚本
- 未定义N维数组的转置 请改用 PREMUTE
- UVA-11019Matrix Matcher(AC自动机)
- ZOJ 2482 IP Address 水题~
- NGUI学习笔记(七):UIPanel剪裁粒子效果
- Java--for 循环之单层循环 执行顺序
- 《大资金动力分析系统》
- 649. Dota2 Senate
- Springmvc返回值