- android/ 167个模块 (app/content/os/view/widget/graphics/media/hardware/net/telephony/provider等) - java/ 35个模块 (lang/io/util/net/nio/security/crypto/sql/beans/rmi/awt等) - javax/ 4个模块 (net/crypto/security/sql) - org/ 5个模块 (json/w3c_dom/xml_sax/xml_pull/apache_http) - dalvik/ 1个模块 (system) - ~3053个类/接口,方法签名完全对齐Android SDK - 桌面跨平台运行 (Windows/macOS/Linux) - 修复所有导入错误和Python关键字冲突
298 lines
9.7 KiB
Python
298 lines
9.7 KiB
Python
"""
|
|
Android graphics.fonts 包 — Font, FontFamily, FontStyle, FontVariationAxis, Typeface
|
|
方法签名完全对齐 Android SDK
|
|
"""
|
|
|
|
from __future__ import annotations
|
|
|
|
import os
|
|
import sys
|
|
from typing import Any, Dict, List, Optional, Tuple
|
|
|
|
from .._core import Stub, AndroidOnlyError
|
|
from ..java.lang import RuntimeException
|
|
|
|
IllegalArgumentException = type("IllegalArgumentException", (RuntimeException,), {})
|
|
|
|
__all__ = [
|
|
"Font",
|
|
"FontFamily",
|
|
"FontStyle",
|
|
"FontVariationAxis",
|
|
"Typeface",
|
|
]
|
|
|
|
|
|
# ═══════════════════════════════════════════════════════════════
|
|
# FontStyle
|
|
# ═══════════════════════════════════════════════════════════════
|
|
|
|
class FontStyle(Stub):
|
|
"""FontStyle — 字体样式"""
|
|
|
|
FONT_SLANT_UPRIGHT = 0
|
|
FONT_SLANT_ITALIC = 1
|
|
FONT_WIDTH_NORMAL = 100
|
|
FONT_WIDTH_CONDENSED = 75
|
|
FONT_WIDTH_EXTENDED = 125
|
|
|
|
def __init__(self, weight: int = 400, slant: int = FONT_SLANT_UPRIGHT,
|
|
width: int = FONT_WIDTH_NORMAL):
|
|
super().__init__()
|
|
self._weight = weight
|
|
self._slant = slant
|
|
self._width = width
|
|
|
|
def getWeight(self) -> int:
|
|
"""获取字重"""
|
|
return self._weight
|
|
|
|
def getSlant(self) -> int:
|
|
"""获取倾斜"""
|
|
return self._slant
|
|
|
|
def getWidth(self) -> int:
|
|
"""获取宽度"""
|
|
return self._width
|
|
|
|
def toString(self) -> str:
|
|
return f"FontStyle(weight={self._weight}, slant={self._slant}, width={self._width})"
|
|
|
|
|
|
# ═══════════════════════════════════════════════════════════════
|
|
# FontVariationAxis
|
|
# ═══════════════════════════════════════════════════════════════
|
|
|
|
class FontVariationAxis(Stub):
|
|
"""FontVariationAxis — 字体变体轴"""
|
|
|
|
def __init__(self, tag: str = "", style_value: float = 0.0):
|
|
super().__init__()
|
|
self._tag = tag
|
|
self._style_value = style_value
|
|
|
|
def getTag(self) -> str:
|
|
"""获取标签"""
|
|
return self._tag
|
|
|
|
def getStyleValue(self) -> float:
|
|
"""获取样式值"""
|
|
return self._style_value
|
|
|
|
def toString(self) -> str:
|
|
return f"FontVariationAxis(tag={self._tag}, value={self._style_value})"
|
|
|
|
def equals(self, other: Any) -> bool:
|
|
if not isinstance(other, FontVariationAxis):
|
|
return False
|
|
return self._tag == other._tag and self._style_value == other._style_value
|
|
|
|
def hashCode(self) -> int:
|
|
return hash((self._tag, self._style_value)) & 0x7FFFFFFF
|
|
|
|
|
|
# ═══════════════════════════════════════════════════════════════
|
|
# Font
|
|
# ═══════════════════════════════════════════════════════════════
|
|
|
|
class Font(Stub):
|
|
"""Font — 字体 (桌面存根,包装系统字体)"""
|
|
|
|
_SYSTEM_FONT_DIRS = [
|
|
"/usr/share/fonts",
|
|
"/System/Library/Fonts",
|
|
"C:\\Windows\\Fonts",
|
|
]
|
|
|
|
def __init__(self, file: Optional[str] = None, buffer: Optional[Any] = None,
|
|
weight: int = 400, italic: bool = False, ttc_index: int = 0,
|
|
axes: Optional[List[FontVariationAxis]] = None):
|
|
super().__init__()
|
|
self._file = file
|
|
self._buffer = buffer
|
|
self._weight = weight
|
|
self._italic = italic
|
|
self._ttc_index = ttc_index
|
|
self._axes = axes or []
|
|
self._native_ptr = 0
|
|
self._font_size = 12.0
|
|
self._obb = None
|
|
self._source = file or "default"
|
|
|
|
def getStyle(self) -> FontStyle:
|
|
"""获取字体样式"""
|
|
return FontStyle(self._weight, FontStyle.FONT_SLANT_ITALIC if self._italic else FontStyle.FONT_SLANT_UPRIGHT)
|
|
|
|
def getBuffer(self) -> Optional[Any]:
|
|
"""获取缓冲区"""
|
|
return self._buffer
|
|
|
|
def getNativePtr(self) -> int:
|
|
"""获取原生指针"""
|
|
return self._native_ptr
|
|
|
|
def getFontSize(self) -> float:
|
|
"""获取字号"""
|
|
return self._font_size
|
|
|
|
def getObb(self) -> Optional[Any]:
|
|
"""获取 OBB"""
|
|
return self._obb
|
|
|
|
def getSource(self) -> str:
|
|
"""获取来源"""
|
|
return self._source
|
|
|
|
def getTtcIndex(self) -> int:
|
|
"""获取 TTC 索引"""
|
|
return self._ttc_index
|
|
|
|
def getWeight(self) -> int:
|
|
"""获取字重"""
|
|
return self._weight
|
|
|
|
def getItalic(self) -> bool:
|
|
"""获取斜体"""
|
|
return self._italic
|
|
|
|
def getAxes(self) -> List[FontVariationAxis]:
|
|
"""获取变体轴列表"""
|
|
return self._axes.copy()
|
|
|
|
def getFile(self) -> Optional[str]:
|
|
"""获取文件路径"""
|
|
return self._file
|
|
|
|
@staticmethod
|
|
def buildNativeTypeface(font: "Font") -> int:
|
|
"""构建原生字体类型"""
|
|
return 0
|
|
|
|
@staticmethod
|
|
def load(file: str, weight: int = 400, italic: bool = False,
|
|
ttc_index: int = 0) -> Optional["Font"]:
|
|
"""从文件加载字体"""
|
|
if os.path.exists(file):
|
|
return Font(file=file, weight=weight, italic=italic, ttc_index=ttc_index)
|
|
return None
|
|
|
|
def toString(self) -> str:
|
|
return f"Font(file={self._file}, weight={self._weight}, italic={self._italic})"
|
|
|
|
|
|
# ═══════════════════════════════════════════════════════════════
|
|
# FontFamily
|
|
# ═══════════════════════════════════════════════════════════════
|
|
|
|
class FontFamily(Stub):
|
|
"""FontFamily — 字体家族"""
|
|
|
|
def __init__(self, fonts: Optional[List[Font]] = None):
|
|
super().__init__()
|
|
self._fonts = fonts or []
|
|
|
|
def addFont(self, font: Font) -> None:
|
|
"""添加字体"""
|
|
self._fonts.append(font)
|
|
|
|
def getFont(self, index: int) -> Optional[Font]:
|
|
"""获取指定索引的字体"""
|
|
if 0 <= index < len(self._fonts):
|
|
return self._fonts[index]
|
|
return None
|
|
|
|
def getSize(self) -> int:
|
|
"""获取字体数量"""
|
|
return len(self._fonts)
|
|
|
|
def toString(self) -> str:
|
|
return f"FontFamily(size={len(self._fonts)})"
|
|
|
|
|
|
# ═══════════════════════════════════════════════════════════════
|
|
# Typeface (fonts package version)
|
|
# ═══════════════════════════════════════════════════════════════
|
|
|
|
class Typeface(Stub):
|
|
"""Typeface — 字体类型 (图形字体包版本)"""
|
|
|
|
DEFAULT: "Typeface" = None
|
|
DEFAULT_BOLD: "Typeface" = None
|
|
MONOSPACE: "Typeface" = None
|
|
SANS_SERIF: "Typeface" = None
|
|
SERIF: "Typeface" = None
|
|
|
|
NORMAL = 0
|
|
BOLD = 1
|
|
ITALIC = 2
|
|
BOLD_ITALIC = 3
|
|
|
|
def __init__(self, family_name: str = "sans-serif", style: int = NORMAL):
|
|
super().__init__()
|
|
self._family_name = family_name
|
|
self._style = style
|
|
self._weight = 400
|
|
if style in (Typeface.BOLD, Typeface.BOLD_ITALIC):
|
|
self._weight = 700
|
|
|
|
@staticmethod
|
|
def defaultFromStyle(style: int) -> "Typeface":
|
|
"""从样式获取默认字体"""
|
|
names = {0: "sans-serif", 1: "sans-serif", 2: "serif", 3: "serif"}
|
|
return Typeface(names.get(style, "sans-serif"), style)
|
|
|
|
@staticmethod
|
|
def create(family_name: str, style: int) -> "Typeface":
|
|
"""创建字体"""
|
|
return Typeface(family_name, style)
|
|
|
|
@staticmethod
|
|
def load(file_path: str, style: int = NORMAL) -> "Typeface":
|
|
"""从文件加载字体"""
|
|
return Typeface("custom", style)
|
|
|
|
def getStyle(self) -> int:
|
|
"""获取字体样式"""
|
|
return self._style
|
|
|
|
def isBold(self) -> bool:
|
|
"""检查是否粗体"""
|
|
return self._style in (Typeface.BOLD, Typeface.BOLD_ITALIC)
|
|
|
|
def isItalic(self) -> bool:
|
|
"""检查是否斜体"""
|
|
return self._style in (Typeface.ITALIC, Typeface.BOLD_ITALIC)
|
|
|
|
def getWeight(self) -> int:
|
|
"""获取字重"""
|
|
return self._weight
|
|
|
|
@staticmethod
|
|
def getSystemFontMap() -> Dict[str, "Typeface"]:
|
|
"""获取系统字体映射"""
|
|
return {
|
|
"sans-serif": Typeface.SANS_SERIF,
|
|
"serif": Typeface.SERIF,
|
|
"monospace": Typeface.MONOSPACE,
|
|
}
|
|
|
|
@staticmethod
|
|
def getSystemFontSettings(weight: int, italic: bool) -> Optional[Font]:
|
|
"""获取系统字体设置"""
|
|
return Font(weight=weight, italic=italic)
|
|
|
|
@staticmethod
|
|
def setSystemFontSettings(font: Font) -> None:
|
|
"""设置系统字体设置"""
|
|
pass
|
|
|
|
def toString(self) -> str:
|
|
return f"Typeface({self._family_name}, style={self._style})"
|
|
|
|
|
|
# Initialize Typeface constants
|
|
Typeface.DEFAULT = Typeface("sans-serif", Typeface.NORMAL)
|
|
Typeface.DEFAULT_BOLD = Typeface("sans-serif", Typeface.BOLD)
|
|
Typeface.MONOSPACE = Typeface("monospace", Typeface.NORMAL)
|
|
Typeface.SANS_SERIF = Typeface("sans-serif", Typeface.NORMAL)
|
|
Typeface.SERIF = Typeface("serif", Typeface.NORMAL) |