Android小工具:使用python生成适配不同分辨率的dimen文件
文章目录
- 1、下载python并配置python路径
- 1.1 下载python软件
- 1.2 配置path
- 1.2.1 自动配置
- 1.2.2 手动配置
- 1.3 验证安装
- 2、编写脚本generate_dimens.py
- 3、使用说明
- 4、准备工作
- 后言
1、下载python并配置python路径
1.1 下载python软件
python下载官网
1.2 配置path
1.2.1 自动配置
在下载python软件的时候,勾选红框部分,可以自动配置用户变量
如图所示,安装时可自定义安装路径,会自动进行配置path
1.2.2 手动配置
手动配置的话就是,在搜索框中搜索“编辑系统环境变量,点击环境变量,对用户变量中的Path进行编辑,写入python的路径
1.3 验证安装
在python安装的路径中,点击路径,输入cmd,进入编辑器中,输入python,出现图片中,说明安装成功,如果安装不成功,看一下是不是把用户变量的path配置成系统变量了。
2、编写脚本generate_dimens.py
import os
import xml.etree.ElementTree as ET
from decimal import Decimal, ROUND_HALF_UP
import sys# 定义不同屏幕尺寸的缩放比例
SCREEN_SIZES = {"sw320dp": 0.9, # 小屏幕设备(3.2英寸)"sw400dp": 0.95, # 中等偏小屏幕"sw480dp": 1.0, # 基准尺寸(中等屏幕)"sw600dp": 1.15, # 7英寸平板"sw720dp": 1.25, # 10英寸平板"sw800dp": 1.35, # 大尺寸平板"sw1000dp": 1.5 # 超大尺寸设备
}def scale_dimension(value, scale_factor):"""缩放尺寸值并返回格式化后的字符串"""# 处理特殊值(如 0dp)if value == "0dp" or value == "0sp":return value# 提取数值和单位unit = value[-2:] if value.endswith(("dp", "sp")) else value[-1:]numeric_value = value[:-len(unit)]try:num = Decimal(numeric_value)except:# 如果无法解析为数字,直接返回原始值return value# 应用缩放比例scaled_value = num * Decimal(scale_factor)# 根据单位决定精度if unit in ("dp", "sp"):# 对于 dp 和 sp,保留一位小数scaled_value = scaled_value.quantize(Decimal('0.1'), rounding=ROUND_HALF_UP)else:# 其他单位保留整数scaled_value = scaled_value.quantize(Decimal('1'), rounding=ROUND_HALF_UP)# 如果小数部分为0,则格式化为整数if scaled_value % 1 == 0:return f"{int(scaled_value)}{unit}"return f"{scaled_value}{unit}"def generate_dimension_files(base_file_path, output_dir):"""生成不同屏幕尺寸的 dimens.xml 文件"""try:# 解析基准 dimens.xml 文件print(f"Parsing base file: {base_file_path}")tree = ET.parse(base_file_path)root = tree.getroot()print(f"Found {len(root.findall('dimen'))} dimension entries")except ET.ParseError as e:print(f"XML parsing error: {e}")print(f"Please check the format of {base_file_path}")returnexcept Exception as e:print(f"Error reading file: {e}")return# 为每个屏幕尺寸生成文件for size, scale in SCREEN_SIZES.items():# 创建新目录size_dir = os.path.join(output_dir, f"values-{size}")os.makedirs(size_dir, exist_ok=True)# 创建新文件output_file = os.path.join(size_dir, "dimens.xml")# 创建新的 XML 结构new_root = ET.Element("resources")# 处理每个 dimen 元素for dimen in root.findall("dimen"):name = dimen.get("name")value = dimen.text# 缩放尺寸值scaled_value = scale_dimension(value, scale)# 创建新元素new_dimen = ET.SubElement(new_root, "dimen", name=name)new_dimen.text = scaled_value# 写入新文件try:with open(output_file, "w", encoding="utf-8") as f:f.write('<?xml version="1.0" encoding="utf-8"?>\n')f.write('<resources>\n')for elem in new_root:f.write(f' <dimen name="{elem.get("name")}">{elem.text}</dimen>\n')f.write('</resources>\n')print(f"Generated: {output_file}")except Exception as e:print(f"Error writing to {output_file}: {e}")if __name__ == "__main__":print("Starting dimension file generation...")# 获取脚本所在目录SCRIPT_DIR = os.path.dirname(os.path.abspath(__file__))print(f"Script directory: {SCRIPT_DIR}")# 配置路径 - 针对标准 Android 项目结构PROJECT_ROOT = os.path.dirname(SCRIPT_DIR)BASE_DIMENS_FILE = os.path.join(PROJECT_ROOT, "app", "src", "main", "res", "values", "dimens.xml")OUTPUT_DIR = os.path.join(PROJECT_ROOT, "app", "src", "main", "res")print(f"Project root: {PROJECT_ROOT}")print(f"Base dimens file path: {BASE_DIMENS_FILE}")print(f"Output directory: {OUTPUT_DIR}")# 检查基准文件是否存在if not os.path.exists(BASE_DIMENS_FILE):print(f"Error: Base dimens file not found at {BASE_DIMENS_FILE}")print("Please make sure:")print("1. The file exists")print("2. The path is correct")print("3. You're running the script from the project root directory")sys.exit(1)# 生成所有尺寸的文件generate_dimension_files(BASE_DIMENS_FILE, OUTPUT_DIR)print("Dimension file generation completed!")
脚本名称为generate_dimens.py
3、使用说明
① 将上面的代码保存为 generate_dimens.py
② 脚本文件放在项目根目录下的 scripts 文件夹中
③ 在项目根目录运行:
python scripts/generate_dimens.py
4、准备工作
在Android中创建文件夹,不然脚本找不到文件夹无法创建,在Android中,基准dimen文件为在480dpi的分辨率的设备中配置的,也可以以其他的为基准,注意编写即可
后言
在适配不同分辨率的设备中,对于一个dimen需要写多个文件,就感觉很繁琐,发现使用python直接提高效率,不需要做一些无用的工作,每次修改的时候也只需要修改一个设备的文件就可,修改结束后再重新运行一下脚本就好了,需要注意的是,如果基准文件dimen为480dpi,但是又有一个480,那么直接运行代码时候,修改基准文件dimen不会导致设备中变量修改,在调试阶段最好是不要有两个,可能有坑