MAML教程
目录 [隐藏]
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
1 MORE & MAML 概述 2 MAML在百变锁屏中的应用
3 MAML在百变壁纸及动态图标中的应用 4 壁纸元素 5 变量 6 变量数组 7 全局变量 8 表达式 9 文本 10 时间 11 日期 12 图片 13 数字图片 14 图片遮罩 15 元素动画 16 Group 17 Slider 18 按钮 19 音乐播放器 20 音量调节 21 Content Provider 22 Trigger & Command 23 动态帧率 24 传感器调用
MORE & MAML 概述
?
MAML引擎脚本语言
MIUI Application Markup Language for MORE (MIUI MORE引擎应用标记语言)
?
MORE渲染引擎
Markup Oriented Rendering Engine (基于标记语言的渲染引擎)
? 概述
最初用于百变锁屏,使用xml用特定的语法描述锁屏界面。后来不断增强功能,逐步演化成一套接近通用的界面描述语言和图形渲染引擎,在一定需求下可用于开发风格多变的用户界面。可方便地通过更换皮肤改变界面风格、动画甚至交互方式。
MAML语言和Android的界面描述xml 类似. 所不同的是Android描述的是静态界面,对界面元素的更改依赖java代码。MAML描述的是静态界面+动态属性,UI在时间线上按一定的帧率不断刷新,UI显示根据元素属性的变量表达式的计算结果实时更新。MAML语言和运行时引擎已经从锁屏中独立出来作为MIUI内置的通用框架,除了显示时间日期等,还支持查询标准Content Provider来获取各种信息如天气。显示图片文本等各种元素,各种动画,滑动点击等界面交互控件,适于实现展示信息或有简单交互操作的界面。比如时钟、天气小部件、闹钟响铃界面。
框架支持动态帧率,不必按照固定帧率不停渲染,在没有动画和更新的时侯停止渲染,此时仅占用极少资源,对于缓慢变化的动画使用低帧率渲染,高动态的动画开始后立即调整到高帧率全速渲染。全速渲染时全屏帧率基本可以达到60帧。合理使用可以既炫酷又不费电。
?
MORE引擎适用哪些类型的界面开发
1. 展示性的信息,如图片,文字 (不适合列表信息和大段文本,不适合用户输入)
2. 需要有丰富的界面动画及交互动画。
3. 较简单的交互,拖拽、点击 (但不限于拖拽点击,通过xml代码可以实现部分类似java编程中onTouchEvent所能做到的交互)
4. 使用标准控件无法实现的信息展示方式,或者无法实现的交互方式,需要自制控件的,大部分可以通过xml代码方便地描述实现。
5. 需要灵活更换皮肤风格,并且界面动画和交互动画甚至部分交互方式都可以通过皮肤更换。无需更改应用程序。
比如一些简单的工具类应用程序、无输入的操作界面希望能更换操作模式(例如来电接听界面)和桌面小工具可以考虑使用,也可以作为一个动画框架实现类似电子贺卡的界面,可支持交互,做为应用程序中的彩蛋(比如短信中的生日彩蛋)
? MIUI主题使用MORE的模块
百变锁屏 com.android.internal.policy.impl.AwesomeLockScreen 桌面时钟 com.miui.home.launcher.gadget.AwesomeClock 相框小工具 com.miui.home.launcher.gadget.PhotoFrame 闹钟响铃界面 com.android.deskclock.AlarmAlertFullScreen
自由桌面动态小部件 com.miui.home.launcher.gadget.AwesomeGadget 百变壁纸 com.miui.home.launcher.MiWallpaper (基于SurfaceView) 动态图标
天气小工具 com.miui.home.launcher.gadget.Weather_2x4_custom (v4)
MAML在百变锁屏中的应用
百变锁屏在主题包里的lockscreen/advance目录下,manifest.xml文件是描述脚本
frameRate: 指定帧率,如果动画缓慢,可以指定小一点的值,省电。默认为30。
displayDesktop: 默认为false,透视到桌面功能,如果没有锁屏壁纸或者锁屏壁纸可以被移开或透明时可以看到桌面launcher或者是锁屏前的应用程序。可以完美实现WP7,Meego,阿里云等的解锁界面。
? ? ? ?
showSysWallpaper: 默认为false,是否在锁屏界面显示桌面壁纸。开启后如果没有指定锁屏壁纸
screenWidth: 设定屏幕宽度标准。如果指定为720,锁屏中所有元素的位置都按720p的布局编写,480p的手机会自动进行缩放。
MAML在百变壁纸及动态图标中的应用
?
百变壁纸
百变壁纸在主题包的miwallpaper目录下,描述文件也是manifest.xml。根节点表示与百变锁屏基本一致:
width:表示百变壁纸的宽度。 height:表示高度
另外,如果要实现元素跟随手指滑动的效果,需要借助#wallpaper_offset_pixel_x,#wallpaper_offset_x
? ?
wallpaper_offset_pixel_x:偏移的像素数 (0 ~ -1*屏宽) wallpaper_offset_x:偏移百分比 (0 ~ 1.0)
二者关系:#wallpaper_offset_x * 屏宽 = -1*#wallpaper_offset_pixel_x
滑动时: 在第一屏,wallpaper_offset_pixel_x = 0, wallpaper_offset_x = 0; 滑到最后一屏,wallpaper_offset_pixel_x = -1*屏宽,wallpaper_offset_x = 1.0
为了适配不同分辨率机型,建议使用#wallpaper_offset_x。建议的设计方式:
1. 2. 3.
?
壁纸切成双屏宽 (屏宽指的是screenWidth) 壁纸定位:x=\屏宽\
需要跟随滑动的元素定位:x=\屏宽 + 相对壁纸的位置\
动态图标
动态图标在主题包icons\\fancy_icons\\目录下,每个动态图标是一个文件夹,文件夹的名字是对应的app包名。例如日历的动态图标是一个叫\的文件夹,里面包含manifest.xml描述文件
hideApplicationMessage: 默认false,屏蔽右上角的通知标志。
useVariableUpdater: 指定需要哪些系统变量,目前包括电量和时间,而且可以指定时间的更新周期,如果时间小工具每秒更新一次,需要指定更新周期为1秒,否则默认会每分钟更新一次。如果小工具或动态图标只显示日期,则每天更新一次,可以指定更新周期为1天。尽量选择较长的更新周期,以节约系统资源。 目前支持的tag: Battery, DateTime.Day, DateTime.Hour,DateTime.Minute,DateTime.Second
如果某个小工具不需要电量或时间变量,则需要使用useVariableUpdater=\,指定不做时间变量等更新。 如果某个小工具显示系统电量并且显示根据时间每小时更换背景图片: useVariableUpdater=\ 如果需要每秒进行多次刷新,可以直接使用frameRate
壁纸元素
Wallpaper元素引用系统设置的壁纸,除了不能指定图片源外其他和Image元素相同,可以有动画和其他属性控制。如果没有此元素则不显示壁纸。可以有多个。 例子:
变量
变量
? ? ? ? ? name 变量名 expression 变量对应的表达式或常量 注意:如果定义字符串常量需要多一套单引号: expression=\ type= number/string 定义数值变量或字符串变量 默认:number const =true 变量只会在初始化时计算一次,以后不会重新计算,可以提高效率。如果变量值会在锁屏运行期间改变,const设为false 默认:false threshold 阈值触发,当变量值的变化超过设定的阈值时,可以触发一些命令。例如: 上述代码表示#time3的值每变化1,就会执行里面的所有命令 ? persist 默认false,变量持久化。指定为ture后,如果没有重新给定该变量其他的值,那么这个值会一直保存,无论解锁后重新锁定或者重新应用主题都不会还原 变量数组