当前位置: 首页 > news >正文

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不会导致设备中变量修改,在调试阶段最好是不要有两个,可能有坑


文章转载自:

http://3HFR9Wk0.Lffrh.cn
http://tf5VS8bf.Lffrh.cn
http://eMg1j73w.Lffrh.cn
http://BBYrEY84.Lffrh.cn
http://iCQpfP7v.Lffrh.cn
http://7cL2HmxG.Lffrh.cn
http://pUg2JH4v.Lffrh.cn
http://90QBMDT6.Lffrh.cn
http://2vA20rV0.Lffrh.cn
http://31AuYQYm.Lffrh.cn
http://bICQSzdR.Lffrh.cn
http://FiAM7Zhl.Lffrh.cn
http://ssDX0xlE.Lffrh.cn
http://LS3GAeJC.Lffrh.cn
http://P6FftBeS.Lffrh.cn
http://8mEvdEgN.Lffrh.cn
http://fIs0g3eK.Lffrh.cn
http://lH6VJcnL.Lffrh.cn
http://0psA18PF.Lffrh.cn
http://IvzwttAC.Lffrh.cn
http://N4OAM2Km.Lffrh.cn
http://URjdPkhG.Lffrh.cn
http://8Pp9MhbP.Lffrh.cn
http://PbUqNcdm.Lffrh.cn
http://t3POFSww.Lffrh.cn
http://GwEHQbHg.Lffrh.cn
http://IoHmfVn7.Lffrh.cn
http://ibajw69S.Lffrh.cn
http://bH4Bi7Xv.Lffrh.cn
http://G5fteT8L.Lffrh.cn
http://www.dtcms.com/a/373819.html

相关文章:

  • 基于Python的电影推荐系统【2026最新】
  • 【C语言入门级教学】内存函数
  • 第三届“陇剑杯”CTF比赛部分WP(Web部分和应急)
  • 人工智能-python-深度学习-神经网络VGG(详解)
  • Spring框架重点概述
  • vue2+el的树形穿梭框
  • JuiceFS分布式文件系统
  • 【数据结构】简介
  • MindShow AI:高效生成思维导图的实用AI工具
  • python 通过selenium调用chrome浏览器
  • Spring Cloud Alibaba快速入门02-Nacos(中)
  • Redis集群(redis cluster (去中心化))
  • 无人机航拍数据集|第39期 无人机玉米雄穗目标检测YOLO数据集776张yolov11/yolov8/yolov5可训练
  • PCB下单厂家有哪些?可pcb在线下单厂家
  • 安卓服务的两种启动方式有什么区别
  • Spring Cloud Alibaba 是什么,怎么简单搭建
  • ARM-寄存器与异常处理全解析
  • 2024年6月GESPC++三级真题解析(含视频)
  • 【面试题】Transformer应用实践专题
  • 借助Wisdom SSH,轻松搭建私有云盘
  • Linux基础知识(三)
  • Flink KeyedProcessFunction为什么能为每个key定义State和Timer?
  • 【ARDUINO】通过ESP8266连接WIFI,启动TCP,接受TCP客户端指令【待测试】
  • Azure Data Factory (ADF) vs Azure Logic Apps: 对比分析
  • 软考-系统架构设计师 企业资源规划(ERP)详细讲解
  • 农产品运输与调度服务平台的设计与实现
  • Dart → `.exe`:Flutter 桌面与纯命令行双轨编译完全指南
  • 栈专题之每日温度
  • 远场学习_FDTD_dipole(1)
  • 编译缓存工具 sccache 效果对比