twrp 2.7.0 ui.xml简单分析,布局讲解,第一章
twrp 的ui.xml文件在bootable/recovery/gui/devices/$(DEVICE_RESOLUTION)/res目录里面
下面我主要分析的是720x1280分辨率的界面布局及功能的实现。
文件的一开始有如下的定义:
<recovery>
<details>
<resolution width="720" height="1280" />
<author>TeamWin</author>
<title>Backup Naowz</title>
<description>Default basic theme</description>
<preview>preview.jpg</preview>
</details> <resources>
<resource name="font" type="font" filename="Roboto-Condensed-30" />
<resource name="mediumfont" type="font" filename="Roboto-Condensed-30" />
<resource name="filelist" type="font" filename="Roboto-Condensed-30" />
<resource name="top_bar" type="image" filename="top-bar.jpg" />
<resource name="main_button" type="image" filename="menu-button" />
<resource name="file_icon" type="image" filename="file" />
<resource name="folder_icon" type="image" filename="folder" />
<resource name="slideout" type="image" filename="slideout" />
<resource name="progress" type="animation" filename="indeterminate" />
<resource name="progress_empty" type="image" filename="progress_empty" />
<resource name="progress_full" type="image" filename="progress_fill" />
<resource name="checkbox_false" type="image" filename="checkbox_empty" />
<resource name="checkbox_true" type="image" filename="checkbox_checked" />
<resource name="radio_false" type="image" filename="radio_empty" />
<resource name="radio_true" type="image" filename="radio_selected" />
<resource name="medium_button" type="image" filename="medium-button" />
<resource name="sort_button" type="image" filename="sort-button" />
<resource name="minus_button" type="image" filename="minus-button" />
<resource name="plus_button" type="image" filename="plus-button" />
<resource name="home_icon" type="image" filename="home-icon" />
<resource name="back_icon" type="image" filename="back-icon" />
<resource name="slider" type="image" filename="slider" />
<resource name="slider-used" type="image" filename="slider-used" />
<resource name="slider-touch" type="image" filename="slider-touch" />
<resource name="unlock-icon" type="image" filename="unlock" />
<resource name="keyboard1" type="image" filename="keyboard1" />
<resource name="keyboard2" type="image" filename="keyboard2" />
<resource name="keyboard3" type="image" filename="keyboard3" />
<resource name="keyboard4" type="image" filename="keyboard4" />
<resource name="cursor" type="image" filename="cursor" />
</resources>
定义的是要调用的资源的相关参数
<variables>
<variable name="col1_x" value="10" />
<variable name="col2_x" value="373" />
<variable name="col_center_x" value="191" />
<variable name="col_center_medium_x" value="275" />
<variable name="center_x" value="360" />
<variable name="row1_y" value="170" />
<variable name="row2_y" value="410" />
<variable name="row3_y" value="650" />
<variable name="row4_y" value="890" />
<variable name="col1_center_x" value="179" />
<variable name="col2_center_x" value="552" />
<variable name="row1_text2_y" value="310" />
<variable name="row2_text2_y" value="550" />
<variable name="row_queue_y" value="760" />
<variable name="row1_header_y" value="120" />
<variable name="row1_text_y" value="170" />
<variable name="row2_text_y" value="220" />
<variable name="row3_text_y" value="270" />
<variable name="row4_text_y" value="320" />
<variable name="row5_text_y" value="370" />
<variable name="row6_text_y" value="420" />
<variable name="row7_text_y" value="470" />
<variable name="row8_text_y" value="520" />
<variable name="row9_text_y" value="570" />
<variable name="row10_text_y" value="620" />
<variable name="row11_text_y" value="670" />
<variable name="row12_text_y" value="720" />
<variable name="row13_text_y" value="770" />
<variable name="row14_text_y" value="820" />
<variable name="row15_text_y" value="870" />
<variable name="row16_text_y" value="920" />
<variable name="row17_text_y" value="970" />
<variable name="row18_text_y" value="1020" />
<variable name="zip_status_y" value="615" />
<variable name="tz_selected_y" value="160" />
<variable name="tz_set_y" value="950" />
<variable name="tz_current_y" value="1180" />
<variable name="col_progressbar_x" value="234" />
<variable name="row_progressbar_y" value="1100" ...
... <variable name="slidervalue_lineh" value="2" />
<variable name="slidervalue_padding" value="20" />
<variable name="slidervalue_sliderw" value="10" />
<variable name="slidervalue_sliderh" value="60" />
</variables>
variables: 定义的是相关的变量,图标的位置,变量的颜色。
下面是最基本的模块 <templates> ,里面定义了头部分,进度条
<templates>
<!-- 这个是头部分定义 ,第一个page 都会调用到的
在这里定义了版本信息,电量信息,……
-->
<template name="header">
<background color="#000000FF" /> <object type="image">
<image resource="top_bar" />
<placement x="0" y="0" />
</object> <object type="text" color="%text_color%">
<font resource="font" />
<placement x="120" y="10" />
<text>Team Win Recovery Project v%tw_version%</text>
</object> <object type="text" color="%text_color%">
<condition var1="tw_simulate_actions" var2="1" />
<font resource="font" />
<placement x="120" y="45" />
<text>SIMULATING ACTIONS</text>
</object> <object type="text" color="%text_color%">
<font resource="font" />
<placement x="120" y="76" />
<text>%tw_time%</text>
</object> <object type="text" color="%text_color%">
<font resource="font" />
<placement x="270" y="76" />
<conditions>
<condition var1="tw_no_battery_percent" var2="0" />
<condition var1="tw_battery" op=">" var2="0" />
<condition var1="tw_battery" op="<" var2="101" />
</conditions>
<text>Battery: %tw_battery%</text>
</object> <object type="button">
<highlight color="%highlight_color%" />
<placement x="%home_button_x%" y="%home_button_y%" />
<font resource="font" color="%button_text_color%" />
<text></text>
<image resource="home_icon" />
<condition var1="tw_busy" var2="0" />
<action function="key">home</action>
</object> <object type="button">
<highlight color="%highlight_color%" />
<placement x="%back_button_x%" y="%back_button_y%" />
<font resource="font" color="%button_text_color%" />
<text></text>
<image resource="back_icon" />
<condition var1="tw_busy" var2="0" />
<action function="key">back</action>
</object> <object type="action">
<touch key="power" />
<action function="overlay">lock</action>
</object>
</template>
下面分析最简单的功能 <page name="reboot"> <!-- 这个是重启菜单的定义布局 -->
<page name="reboot">
<object type="template" name="header" /> <!-- 这里引用临时模块header ,用于显示时间和电量,及版本信息 --> <object type="text" color="%text_color%"> <!-- 开始 text 变量的定义,也是文字的颜色 -->
<font resource="font" /> <!-- 引用字体资源 ,在最开始的资源变量中有定义 -->
<placement x="%center_x%" y="%row1_header_y%" placement="5" /> <!-- 这是是定义菜单的显示位置 -->
<text>Reboot Menu</text> <!-- 显示在reboot菜单的最顶端, "Reboot Menu" -->
</object> <!-- 结束 text 的定义 --> <object type="button"> <!-- 按钮定义 -->
<highlight color="%highlight_color%" />
<condition var1="tw_reboot_system" var2="1" />
<placement x="%col1_x%" y="%row1_y%" /> <!-- 定义这个按钮的位置, 在第一行,第一列 -->
<font resource="font" color="%button_text_color%" />
<text>System</text>
<image resource="main_button" /> <!-- 声明这个按钮是主按钮,-->
<actions> <!-- 声明要执行的操作 -->
<action function="set">tw_back=reboot</action> <!-- 声明要返回的page -->
<action function="set">tw_action=reboot</action> <!-- 声明要执行的命令reboot ,这个命令人在actions.cpp中会检查 -->
<action function="set">tw_action_param=system</action> <!-- 命令要用到的参数,这里是system
<action function="set">tw_has_action2=0</action>
<action function="set">tw_text1=No OS Installed! Are you</action>
<action function="set">tw_text2=sure you wish to reboot?</action>
<action function="set">tw_action_text1=Rebooting...</action>
<action function="set">tw_complete_text1=Rebooting...</action>
<action function="set">tw_slider_text=Swipe to Reboot</action>
<action function="page">rebootcheck</action>
</actions>
</object> <object type="button">
<highlight color="%highlight_color%" />
<condition var1="tw_reboot_poweroff" var2="1" />
<placement x="%col2_x%" y="%row1_y%" /> <!-- 位置是第一行,第二列 -->
<font resource="font" color="%button_text_color%" />
<text>Power Off</text>
<image resource="main_button" />
<actions>
<action function="set">tw_back=reboot</action>
<action function="set">tw_action=reboot</action>
<action function="set">tw_action_param=poweroff</action>
<action function="set">tw_has_action2=0</action>
<action function="set">tw_text1=No OS Installed! Are you</action>
<action function="set">tw_text2=sure you wish to power off?</action>
<action function="set">tw_action_text1=Turning Off...</action>
<action function="set">tw_complete_text1=Turning Off...</action>
<action function="set">tw_slider_text=Swipe to Power Off</action>
<action function="page">rebootcheck</action>
</actions>
</object> <object type="button">
<highlight color="%highlight_color%" />
<condition var1="tw_reboot_recovery" var2="1" />
<placement x="%col1_x%" y="%row2_y%" /> <!-- 第二行,第一列 -->
<font resource="font" color="%button_text_color%" />
<text>Recovery</text>
<image resource="main_button" />
<actions>
<action function="set">tw_back=reboot</action>
<action function="set">tw_action=reboot</action>
<action function="set">tw_action_param=recovery</action>
<action function="set">tw_has_action2=0</action>
<action function="set">tw_text1=No OS Installed! Are you</action>
<action function="set">tw_text2=sure you wish to reboot?</action>
<action function="set">tw_action_text1=Rebooting...</action>
<action function="set">tw_complete_text1=Rebooting...</action>
<action function="set">tw_slider_text=Swipe to Reboot</action>
<action function="page">rebootcheck</action>
</actions>
</object> <object type="button">
<highlight color="%highlight_color%" />
<condition var1="tw_reboot_bootloader" var2="1" />
<placement x="%col2_x%" y="%row2_y%" />
<font resource="font" color="%button_text_color%" />
<text>Bootloader</text>
<image resource="main_button" />
<actions>
<action function="set">tw_back=reboot</action>
<action function="set">tw_action=reboot</action>
<action function="set">tw_action_param=bootloader</action>
<action function="set">tw_has_action2=0</action>
<action function="set">tw_text1=No OS Installed! Are you</action>
<action function="set">tw_text2=sure you wish to reboot?</action>
<action function="set">tw_action_text1=Rebooting...</action>
<action function="set">tw_complete_text1=Rebooting...</action>
<action function="set">tw_slider_text=Swipe to Reboot</action>
<action function="page">rebootcheck</action>
</actions>
</object> <object type="button">
<highlight color="%highlight_color%" />
<condition var1="tw_download_mode" var2="1" />
<placement x="%col1_x%" y="%row3_y%" />
<font resource="font" color="%button_text_color%" />
<text>Download</text>
<image resource="main_button" />
<actions>
<action function="set">tw_back=reboot</action>
<action function="set">tw_action=reboot</action>
<action function="set">tw_action_param=download</action>
<action function="set">tw_has_action2=0</action>
<action function="set">tw_text1=No OS Installed! Are you</action>
<action function="set">tw_text2=sure you wish to reboot?</action>
<action function="set">tw_action_text1=Rebooting...</action>
<action function="set">tw_complete_text1=Rebooting...</action>
<action function="set">tw_slider_text=Swipe to Reboot</action>
<action function="page">rebootcheck</action>
</actions>
</object> <object type="action">
<touch key="home" /> <!-- 在菜单的最底部,定义的动作, home 键 -->
<action function="page">main</action> <!-- 回到的<page name="main">
</object> <object type="action">
<touch key="back" /> <!-- 返回键 back -->
<action function="page">main</action>
</object> <object type="template" name="footer" /> <!-- 临时模块 footer -->
</page> <!-- page 模块的结束 -->
下面来讲解一下实现sideload功能的page
<page name="sideload">
<object type="template" name="header" /> <object type="text" color="%text_color%">
<font resource="font" />
<placement x="%center_x%" y="%row1_header_y%" placement="5"/>
<text>ADB Sideload</text>
</object> <object type="checkbox"> <!--这里是checkbox 选项 ,其中的变量,需要修改data.cpp -->
<placement x="%col1_x%" y="%row2_text_y%" />
<font resource="font" color="%text_color%" />
<text>Wipe Dalvik Cache.</text>
<data variable="tw_wipe_dalvik" /> <!-- 这个变量的定义如下:mvalues.insert(make_pair("tw_wipe_cache", make_pair("0", 0))); 初始化为 0 即, false --> <image checked="checkbox_true" unchecked="checkbox_false" /> <!-- 设置相应的图片显示已经选,没有选 -->
</object> <object type="checkbox">
<placement x="%col1_x%" y="%row3_text_y%" />
<font resource="font" color="%text_color%" />
<text>Wipe Cache.</text>
<data variable="tw_wipe_cache" />
<image checked="checkbox_true" unchecked="checkbox_false" />
</object> <object type="slider">
<placement x="%slider_x%" y="%slider_y%" />
<resource base="slider" used="slider-used" touch="slider-touch" />
<actions>
<action function="set">tw_back=advanced</action>
<action function="set">tw_action=adbsideload</action>
<action function="set">tw_action_text1=ADB Sideload</action>
<action function="set">tw_action_text2=Usage: adb sideload filename.zip</action>
<action function="set">tw_complete_text1=ADB Sideload Complete</action>
<action function="set">tw_has_cancel=1</action>
<action function="set">tw_show_reboot=1</action>
<action function="set">tw_cancel_action=adbsideloadcancel</action>
<action function="page">action_page</action> <!-- 这个page 实现的功能就是,新开一个page,并显示进度条 -->
</actions>
</object> <object type="text" color="%text_color%">
<font resource="font" />
<placement x="%center_x%" y="%slider_text_y%" placement="4" />
<text>Swipe to Start Sideload</text> <!-- 在slider里面显示的文件 -->
</object> <object type="action">
<touch key="home" />
<action function="page">main</action>
</object> <object type="action">
<touch key="back" />
<action function="page">advanced</action>
</object> <object type="template" name="footer" />
</page>
twrp 2.7.0 ui.xml简单分析,布局讲解,第一章的更多相关文章
- 《DirectX 9.0 3D游戏开发编程基础》 第一章 初始化Direct3D 读书笔记
REF设备 参考光栅设备,他能以软件计算方式完全支持Direct3D Api.借助Ref设备,可以在代码中使用那些不为当前硬件所支持的特性,并对这此特性进行测试. D3DDEVTYPE 在程序代码中, ...
- 深入学习重点分析java基础---第一章:深入理解jvm(java虚拟机) 第一节 java内存模型及gc策略
身为一个java程序员如果只会使用而不知原理称其为初级java程序员,知晓原理而升中级.融会贯通则为高级 作为有一个有技术追求的人,应当利用业余时间及零碎时间了解原理 近期在看深入理解java虚拟机 ...
- PDF格式简单分析
上周因需要编辑了下PDF,用了一两个试用软件,感觉文字版的PDF还是挺好编辑的.想要研究一下PDF格式. 0. 站在前辈的肩膀上 从前辈的文章和书籍了解到 PDF文件是一种文本和二进制混排的格式,二进 ...
- 【Android】11.0 UI开发(二)——列表控件ListView的简单实现1
************************ 转载请注明出处:https://www.cnblogs.com/xiaofu007/p/10342462.html ***************** ...
- 【Android】12.0 UI开发(三)——列表控件ListView的简单实现2
1.0 由于书上内容,已经和实际编程的兼容性已经不太友好,重写了项目,用于进一步学习列表控件ListView. 2.0 新建项目ListViewTest,其中文件目录如下: 3.0 ActivityC ...
- iOS开发UI篇—简单的浏览器查看程序
iOS开发UI篇—简单的浏览器查看程序 一.程序实现要求 1.要求 2. 界面分析 (1) 需要读取或修改属性的控件需要设置属性 序号标签 图片 图片描述 左边按钮 右边按钮 (2) 需要监听响应事件 ...
- CSipSimple 简单分析
简介 CSipSimple是一款可以在android手机上使用的支持sip的网络电话软件,可以在上面设置使用callda网络电话.连接使用方式最好是使用wifi,或者3g这样上网速度快,打起电话来效果 ...
- C#中异常:“The type initializer to throw an exception(类型初始值设定项引发异常)”的简单分析与解决方法
对于C#中异常:“The type initializer to throw an exception(类型初始值设定项引发异常)”的简单分析,目前本人分析两种情况,如下: 情况一: 借鉴麒麟.NET ...
- jQuery 2.0.3 源码分析Sizzle引擎解析原理
jQuery 2.0.3 源码分析Sizzle引擎 - 解析原理 声明:本文为原创文章,如需转载,请注明来源并保留原文链接Aaron,谢谢! 先来回答博友的提问: 如何解析 div > p + ...
随机推荐
- CentOS7/RHEL7安装Redis步骤详解
CentOS7/RHEL7安装Redis步骤详解 CentOS7/RHEL7安装Redis还是头一次测试安装了,因为centos7升级之后与centos6有比较大的区别了,下面我们就一起来看看Cent ...
- 深入探讨:LBS是一种工具而非一种模式
移动互联网的快速发展,带动着移动互联网应用的不断创新.从2010起,LBS的概念就在中国迅速兴起,但到了2011年底提供LBS服务的企业从最多50家已经降至仅剩15家.投行在看好移动互联网的同时又对L ...
- cocos2d-x游戏开发 跑酷(四) 关联与物理世界
原创.转载注明出处http://blog.csdn.net/dawn_moon/article/details/21451077 前面一节尽管实现了一个跑动的人物,可是他只不过一个精灵在运行一个跑动的 ...
- 黑马程序员:Java基础总结----泛型(高级)
黑马程序员:Java基础总结 泛型(高级) ASP.Net+Android+IO开发 . .Net培训 .期待与您交流! 泛型(高级) 泛型是提供给javac编译器使用的,可以限定集合中的输入类型 ...
- mongodb分页优化
现在参与一个项目的开发,需要用java查询mongodb数据库,在这里分页用的skip sort 和limit结合,查询语句如下(已经在相关字段建立索引) DBCursor cursor = coll ...
- POj 1879 Tempus et mobilius Time and motion (模拟+群)
题目特别长,大意为球的传递. 三个轨道,一个库.各自是分钟单位的轨道.5min单位的轨道.一小时单位的轨道.还有就是n容量的库. 每过一分钟,一个小球从库里面出来,库符合先进先出,进入分钟轨道.假设分 ...
- php 双向队列类
(deque,全名double-ended queue)是一种具有队列和栈的性质的数据结构.双向队列中的元素能够从两端弹出,其限定插入和删除操作在表的两端进行. 在实际使用中,还能够有输出受限的双向队 ...
- poj2236(并查集)
题目连接 题意:一张图上分布着n台坏了的电脑,并知道它们的坐标.两台修好的电脑如果距离<=d就可以联网,也可以通过其他修好的电脑间接相连.给出操作“O x”表示修好x,给出操作“S x y”,请 ...
- [poj 1127]Jack Straws[线段相交][并查集]
题意: 给出一系列线段,判断某两个线段是否连通. 思路: 根据线段相交情况建立并查集, 在同一并查集中则连通. (第一反应是强连通分量...实际上只要判断共存即可, 具体的方向啊是没有关系的..) 并 ...
- 使用注解实现 bean 转 csv
csv 文件是 aaa,bbb,ccc aaa,bbb,ccc 保存 这里的要求是 List<T> 线性表的类型 转换成 类别似 html 中 table的格式,即第一行是 head 后面 ...