feat: 4ma 用车计时助手 v1.0
- 无障碍服务监听7MA出行小程序,匹配关键词自动开始/结束计时 - 事件驱动截图+ML Kit离线中文OCR兜底,解决WebView无障碍树不稳定 - 常驻计时通知(15/18/30分钟提醒)与结束用车按钮 - 浅色主题主界面:权限状态、具体实现、安全/免责/法律声明 - 电池白名单+自启动引导+onUnbind自动重绑守护 - 无网络权限,完全离线运行
This commit is contained in:
commit
2cf3cbad56
34 files changed
+2158
No files matched your search
@@ -0,0 +1,79 @@
|
||||
# 生成 4ma 应用图标(PNG,各密度 mipmap)
|
||||
# 设计:浅色圆角底板 + 绿色圆角方块 + 白色加粗 "4ma"
|
||||
import os
|
||||
from PIL import Image, ImageDraw, ImageFont
|
||||
|
||||
BASE = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
|
||||
RES = os.path.join(BASE, "app", "src", "main", "res")
|
||||
|
||||
SIZES = {
|
||||
"mipmap-mdpi": 48,
|
||||
"mipmap-hdpi": 72,
|
||||
"mipmap-xhdpi": 96,
|
||||
"mipmap-xxhdpi": 144,
|
||||
"mipmap-xxxhdpi": 192,
|
||||
}
|
||||
|
||||
MASTER = 1024
|
||||
BG = (242, 247, 251, 255) # 浅色底板
|
||||
TILE = (16, 185, 129, 255) # 品牌绿 #10B981
|
||||
TILE_DARK = (5, 150, 105, 255) # 深绿 #059669
|
||||
WHITE = (255, 255, 255, 255)
|
||||
|
||||
|
||||
def load_font(size):
|
||||
for name in ("segoeuib.ttf", "arialbd.ttf", "DejaVuSans-Bold.ttf"):
|
||||
for root in (os.environ.get("WINDIR", "C:/Windows") + "/Fonts", "/usr/share/fonts/truetype"):
|
||||
p = os.path.join(root, name)
|
||||
if os.path.exists(p):
|
||||
try:
|
||||
return ImageFont.truetype(p, size)
|
||||
except Exception:
|
||||
continue
|
||||
return ImageFont.load_default()
|
||||
|
||||
|
||||
def make_master():
|
||||
img = Image.new("RGBA", (MASTER, MASTER), (0, 0, 0, 0))
|
||||
d = ImageDraw.Draw(img)
|
||||
|
||||
# 底板:整幅浅色(launcher 会自行裁形)
|
||||
d.rectangle([0, 0, MASTER, MASTER], fill=BG)
|
||||
|
||||
# 绿色圆角方块(留 16% 边距)
|
||||
m = int(MASTER * 0.16)
|
||||
d.rounded_rectangle([m, m, MASTER - m, MASTER - m],
|
||||
radius=int(MASTER * 0.19), fill=TILE)
|
||||
|
||||
# 底部 1/4 叠加深绿,做出轻微渐变感
|
||||
overlay = Image.new("RGBA", (MASTER, MASTER), (0, 0, 0, 0))
|
||||
od = ImageDraw.Draw(overlay)
|
||||
od.rounded_rectangle([m, MASTER - int(MASTER * 0.30), MASTER - m, MASTER - m],
|
||||
radius=int(MASTER * 0.19), fill=TILE_DARK)
|
||||
img = Image.alpha_composite(img, overlay)
|
||||
d = ImageDraw.Draw(img)
|
||||
|
||||
# 白色加粗 "4ma"
|
||||
font = load_font(int(MASTER * 0.40))
|
||||
text = "4ma"
|
||||
bb = d.textbbox((0, 0), text, font=font)
|
||||
w = bb[2] - bb[0]
|
||||
h = bb[3] - bb[1]
|
||||
x = (MASTER - w) / 2 - bb[0]
|
||||
y = (MASTER - h) / 2 - bb[1]
|
||||
d.text((x, y), text, font=font, fill=WHITE)
|
||||
return img
|
||||
|
||||
|
||||
def main():
|
||||
master = make_master()
|
||||
for folder, size in SIZES.items():
|
||||
out_dir = os.path.join(RES, folder)
|
||||
os.makedirs(out_dir, exist_ok=True)
|
||||
out = os.path.join(out_dir, "ic_launcher.png")
|
||||
master.resize((size, size), Image.LANCZOS).save(out)
|
||||
print("written:", out)
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
main()
|
||||
Reference in new issue
Block a user