mirror of
https://github.com/feicong/rom-course.git
synced 2025-08-29 02:35:20 +00:00
第4章内容提交
This commit is contained in:
parent
8c5ffa8bd0
commit
f1335e70dd
@ -189,10 +189,140 @@ make -j$(nproc --all)
|
|||||||
|
|
||||||
通常情况下,`Android`应用程序需要为不同的屏幕密度提供不同版本的图像资源,以确保在不同的设备上以最佳方式显示。例如,在 `drawable-mdpi` 目录中存储基于中等密度屏幕(`mdpi`)的图像资源,而在 `drawable-hdpi` 目录中存储基于高密度屏幕(`hdpi`)的图像资源。
|
通常情况下,`Android`应用程序需要为不同的屏幕密度提供不同版本的图像资源,以确保在不同的设备上以最佳方式显示。例如,在 `drawable-mdpi` 目录中存储基于中等密度屏幕(`mdpi`)的图像资源,而在 `drawable-hdpi` 目录中存储基于高密度屏幕(`hdpi`)的图像资源。
|
||||||
|
|
||||||
然而,有时候应用程序需要使用固定大小的图像资源,并且不希望这些图像被缩放或扩展以适应不同的屏幕密度。在这种情况下,就可以使用 `drawable-nodpi` 目录来存储这些图像资源。这些图像将忽略设备的屏幕密度,并显示为其原始大小。
|
然而,有时候应用程序需要使用固定大小的图像资源,并且不希望这些图像被缩放或扩展以适应不同的屏幕密度。在这种情况下,就可以使用 `drawable-nodpi` 目录来存储这些图像资源。这些图像将忽略设备的屏幕密度,并显示为其原始大小。例如在前文看到的桌面壁纸,就是使用的`nodpi`目录存放的资源文件。
|
||||||
|
|
||||||
需要注意的是,使用 `drawable-nodpi` 目录要慎重考虑,并尽可能避免使用。因为它们不适用于适应不同屏幕密度的需求,可能会导致在某些设备上显示不正确。需要确保图像资源已经按照目标大小进行了生成,并且能够在所有设备上显示正确。
|
需要注意的是,使用 `drawable-nodpi` 目录要慎重考虑,并尽可能避免使用。因为它们不适用于适应不同屏幕密度的需求,可能会导致在某些设备上显示不正确。需要确保图像资源已经按照目标大小进行了生成,并且能够在所有设备上显示正确。
|
||||||
|
|
||||||
根据以上的信息,知道了图标是在`res`中`mipmap`开头的目录中。在这里以桌面的中的`Setting`应用为例子,找到目录`packages/apps/Settings/res/mipmap-hdpi/`看到了对应桌面中`Setting`的应用程序图标,文件名为`ic_launcher_settings.png`。而要替换该图标,直接使用新文件替换该图标即可。
|
根据以上的信息,知道了图标是在`res`中`mipmap`开头的目录中。在这里以桌面的中的`Setting`应用为例子,找到目录`packages/apps/Settings/res/mipmap-hdpi/`看到了对应桌面中`Setting`的应用程序图标,文件名为`ic_launcher_settings.png`。而要替换该图标,直接使用新文件替换该图标即可。
|
||||||
|
|
||||||
当然,如果要全部手动替换,来将系统中的图标更换是非常费力的一件事情,所以在了解完替换图标的原理后,可以通过开发一个简单的脚本来完成,例如`Setting`的图标是`ic_launcher_settings.png`,`Contacts`的图标是`ic_contacts_launcher.png`,`Calendar`的图标为`ic_launcher_calendar.png`,将系统中的常用图标找齐对应的文件名后,通过脚本来搜索目录,找到对应路径,然后根据新的素材文件对其一一替换,即可完成批量的工作。这里就不展开进行详细演示了。
|
当然,如果要全部手动替换,来将系统中的图标更换是非常费力的一件事情,所以在了解完替换图标的原理后,可以通过开发一个简单的脚本来完成,例如`Setting`的图标是`ic_launcher_settings.png`,`Contacts`的图标是`ic_contacts_launcher.png`,`Calendar`的图标为`ic_launcher_calendar.png`,将系统中的常用图标找齐对应的文件名后,通过脚本来搜索目录,找到对应路径,然后根据新的素材文件对其一一替换,即可完成批量的工作。实现代码如下。
|
||||||
|
|
||||||
|
```python
|
||||||
|
import os
|
||||||
|
import shutil
|
||||||
|
import subprocess
|
||||||
|
|
||||||
|
# 执行cmd命令
|
||||||
|
def exec(cmd):
|
||||||
|
proc = subprocess.Popen(
|
||||||
|
cmd,
|
||||||
|
shell=True,
|
||||||
|
stdout=subprocess.PIPE,
|
||||||
|
stderr=subprocess.STDOUT,
|
||||||
|
stdin=subprocess.PIPE # 重定向输入值
|
||||||
|
)
|
||||||
|
proc.stdin.close() # 既然没有命令行窗口,那就关闭输入
|
||||||
|
result = proc.stdout.read() # 读取cmd执行的输出结果(是byte类型,需要decode)
|
||||||
|
proc.stdout.close()
|
||||||
|
return result.decode(encoding="utf-8")
|
||||||
|
|
||||||
|
# 替换图标
|
||||||
|
def replacePng(target,appName):
|
||||||
|
# 搜索该路径下的图标
|
||||||
|
cmdRes = exec(f"find /home/king/android_src/mikrom12_gitlab/packages/ -name {target}")
|
||||||
|
filePathList = cmdRes.split("\n")
|
||||||
|
curpath=os.getcwd()
|
||||||
|
# 遍历所有搜到的结果
|
||||||
|
for filepath in filePathList:
|
||||||
|
if filepath=="":
|
||||||
|
continue
|
||||||
|
# 为了避免其他应用的同名素材图标,所以使用appName过滤一下
|
||||||
|
if appName not in filepath:
|
||||||
|
continue
|
||||||
|
print('Found file: ' + filepath)
|
||||||
|
# 先将文件进行备份
|
||||||
|
shutil.copy(filepath,filepath+".bak")
|
||||||
|
# 然后将当前目录准备好的替换文件复制进去
|
||||||
|
replacePath=curpath+"/images/"+target
|
||||||
|
# 如果新文件不存在,则结束该文件的替换
|
||||||
|
if os.path.exists(replacePath)==False:
|
||||||
|
print("not found replace file:",replacePath)
|
||||||
|
break
|
||||||
|
shutil.copy(replacePath, filepath)
|
||||||
|
|
||||||
|
# 使用备份的文件还原该图标
|
||||||
|
def unReplacePng(target):
|
||||||
|
# 查找目标文件
|
||||||
|
cmdRes = exec(f"find /home/king/android_src/mikrom12_gitlab/frameworks/base/packages/ -name {target}")
|
||||||
|
filePathList = cmdRes.split("\n")
|
||||||
|
# 遍历所有结果
|
||||||
|
for filepath in filePathList:
|
||||||
|
if filepath=="":
|
||||||
|
continue
|
||||||
|
print('Found file: ' + filepath)
|
||||||
|
# 备份文件如果存在,则将其还原
|
||||||
|
bakfile=filepath + ".bak"
|
||||||
|
if os.path.exists(bakfile):
|
||||||
|
shutil.copy(bakfile, filepath)
|
||||||
|
print("unReplace file:",bakfile)
|
||||||
|
|
||||||
|
def main():
|
||||||
|
# 替换为新素材
|
||||||
|
replacePng('ic_launcher_settings.png',"Setting")
|
||||||
|
replacePng('ic_contacts_launcher.png',"Contacts")
|
||||||
|
replacePng('ic_launcher_calendar.png',"Calendar")
|
||||||
|
|
||||||
|
# 还原素材
|
||||||
|
# unReplacePng('ic_launcher_settings.png')
|
||||||
|
# unReplacePng('ic_contacts_launcher.png')
|
||||||
|
# unReplacePng('ic_launcher_calendar.png')
|
||||||
|
|
||||||
|
if __name__ == '__main__':
|
||||||
|
main()
|
||||||
|
|
||||||
|
```
|
||||||
|
|
||||||
|
### 4.6 修改开机动画
|
||||||
|
|
||||||
|
在`Android`中的开机动画并不是一个视频文件,或者`gif`文件,而是一个名为`bootanimation.zip`的压缩包文件。在这个压缩包文件中,有着若干`png`格式的图片,以及一个`desc`的描述文件,在开机时,系统会按照描述文件依次播放图片,关于该压缩文件的说明文档可以查看源码中的文件`frameworks/base/cmds/bootanimation/FORMAT.md`,下面是开机动画压缩包中的包含的文件说明。
|
||||||
|
|
||||||
|
```
|
||||||
|
desc.txt - a text file
|
||||||
|
part0 \
|
||||||
|
part1 \ directories full of PNG frames
|
||||||
|
... /
|
||||||
|
partN /
|
||||||
|
```
|
||||||
|
|
||||||
|
解压开机动画压缩包后的文件如下图。
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
`desc.txt`文件内容如下。
|
||||||
|
|
||||||
|
```
|
||||||
|
832 520 30
|
||||||
|
c 1 30 part0
|
||||||
|
c 1 0 part1
|
||||||
|
c 0 0 part2
|
||||||
|
c 1 30 part3
|
||||||
|
c 1 0 part4
|
||||||
|
c 1 0 part5
|
||||||
|
```
|
||||||
|
|
||||||
|
第一行的`832 520`是图片的分辨率,`30`是播放帧率,每秒播放`30`张图片。
|
||||||
|
|
||||||
|
第二行中,`c` 表示该部分将播放到完成,不管其他部分是否已经播放完毕。与此相反,如果第一个参数是`p` 表示该部分将一直播放,直到被新的部分替换或整个动画结束。第二个参数`1`代表播放`1`次。第三个参数表示播放的间隔,第四个参数表示对哪个目录的图片生效。
|
||||||
|
|
||||||
|
查看其中一个目录下的文件如下图。
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
对这些了解后,接着开始对其进行替换,为了便于简单演示,就不找新的素材进行替换了,直接讲`androidtv`的开机动画替换为当前开机动画,找到文件`device/google/atv/products/bootanimations/bootanimation.zip`,将其复制到自定义的任意目录,例如新建目录`packages/bootstart/`,将启动动画拷贝到该目录中。然后在文件`build/make/target/product/generic_system.mk`添加配置,将其拷贝到`system/media/`目录下。相关修改如下。
|
||||||
|
|
||||||
|
```
|
||||||
|
PRODUCT_COPY_FILES += \
|
||||||
|
packages/bootstart/bootanimation.zip:system/media/bootanimation.zip \
|
||||||
|
```
|
||||||
|
|
||||||
|
如果是自己制作的开机动画压缩包,可以在`desc.txt`所在的目录中执行命令`zip -0 -r ../bootanimation-832.zip ./*`,则会在上一级目录生成新的动画压缩文件。
|
||||||
|
|
||||||
|
最后编译后,重新刷机。在开机时,即可看到开机动画发生了变动。在开机进入系统后,如果想要重新播放开机动画,可以执行下面的命令。
|
||||||
|
|
||||||
|
```
|
||||||
|
adb shell
|
||||||
|
setprop ctl.start bootanim #执行开机动画
|
||||||
|
getprop ctl.start bootanim #停止开机动画
|
||||||
|
```
|
||||||
|
|
||||||
|
|
||||||
|
BIN
chapter-04/images/bootanimation.png
Normal file
BIN
chapter-04/images/bootanimation.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 6.3 KiB |
BIN
chapter-04/images/play.png
Normal file
BIN
chapter-04/images/play.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 60 KiB |
Loading…
x
Reference in New Issue
Block a user