MAML教程
MORE & MAML 概述----------------- MAML在百变锁屏中的应用---------- MAML在百变壁纸及动态图标中的应用 壁纸元素------------------------ 变量---------------------------- 变量数组------------------------ 全局变量------------------------ 表达式-------------------------- 文本---------------------------- 时间---------------------------- 日期---------------------------- 图片---------------------------- 数字图片------------------------ 图片遮罩------------------------ 元素动画------------------------ Slider-------------------------- 按钮---------------------------- 音乐播放器---------------------- 音量调节------------------------ Content Provider---------------- Trigger & Command--------------- 动态帧率------------------------ 传感器调用----------------------
-------------------------------------------------1 -------------------------------------------------2 -------------------------------------------------2 -------------------------------------------------3 -------------------------------------------------3 -------------------------------------------------4 -------------------------------------------------6 -------------------------------------------------7 -------------------------------------------------8 -------------------------------------------------9 -------------------------------------------------9 ------------------------------------------------10 ------------------------------------------------10 ------------------------------------------------11 ------------------------------------------------11 ------------------------------------------------13 ------------------------------------------------15 ------------------------------------------------17 ------------------------------------------------19 ------------------------------------------------19 ------------------------------------------------23 ------------------------------------------------28 ------------------------------------------------28
- 1 -
MORE & MAML 概述 ? ? ?
MAML引擎脚本语言 MORE渲染引擎 概述
MIUI Application Markup Language for MORE (MIUI 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
- 1 -
百变壁纸 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:表示高度
- 2 -
另外,如果要实现元素跟随手指滑动的效果,需要借助#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。建议的设计方式: 壁纸切成双屏宽 (屏宽指的是screenWidth) 壁纸定位:x=\屏宽\
需要跟随滑动的元素定位:x=\屏宽 + 相对壁纸的位置\
? 动态图标
动态图标在主题包icons\\fancy_icons\\目录下,每个动态图标是一个文件夹,文件夹的名字是对应的app包名。例如日历的动态图标是一个叫\的文件夹,里面包含manifest.xml描述文件
screenWidth=\
hideApplicationMessage: 默认false,屏蔽右上角的通知标志。
useVariableUpdater: 指定需要哪些系统变量,目前包括电量和时间,而且可以指定时间的更新周期,如果时间小工具每秒更新一次,需要指定更新周期为1秒,否则默认会每分钟更新一次。如果小工具或动态图标只显示日期,则每天更新一次,可以指定更新周期为1天。尽量选择较长的更新周期,以节约系统资源。 目前支持的tag: Battery, DateTime.Day,
DateTime.Hour,DateTime.Minute,DateTime.Second
如果某个小工具不需要电量或时间变量,则需要使用useVariableUpdater=\,指定不做时间变量等更新。
如果某个小工具显示系统电量并且显示根据时间每小时更换背景图片: useVariableUpdater=\如果需要每秒进行多次刷新,可以直接使用frameRate
壁纸元素
Wallpaper元素引用系统设置的壁纸,除了不能指定图片源外其他和Image元素相同,可以有动画和其他属性控制。如果没有此元素则不显示壁纸。可以有多个。 例子:
变量 - 3 -
变量
name 变量名 expression 变量对应的表达式或常量 注意:如果定义字符串常量需要多一套单引号: expression=\ type= number/string 定义数值变量或字符串变量 默认:number const =true 变量只会在初始化时计算一次,以后不会重新计算,可以提高效率。如果变量值会在锁屏运行期间改变,const设为false 默认:false threshold 阈值触发,当变量值的变化超过设定的阈值时,可以触发一些命令。例如:
上述代码表示#time3的值每变化1,就会执行
persist 默认false,变量持久化。指定为ture后,如果没有重新给定该变量其他的值,那么这个值会一直保存,无论解锁后重新锁定或者重新应用主题都不会还原
变量数组
?
- 4 - ? ? ? Item 数组元素定义 expression 元素对应的表达式 value 如果元素是常量,则用value指定常量值 // 定义了一个每隔两秒轮换一次日期显示格式的DateTime元素. // 数组元素可以用来根据数字变量值显示不同的字符串 expression=\const=\ expression=\type=\ - 5 - 全局变量 unlocker: ? ? ? ? ? ? ? ? ? time: ? ? ? ? ? ? ? ? ? ? ? ? 农历 ? ? ? ? ? ? ? screen: ? ? ? ? image: ? ? unlocker.move_x 解锁部件在x方向的偏移 unlocker.move_y 解锁部件在y方向的偏移 unlocker.move_dist 解锁部件移动的距离 unlocker.state 解锁部件的状态: 0 normal, 1 pressed, 2 reached touch_x 当前触摸点的x坐标 touch_y touch_begin_x 按下屏幕时的初始x坐标 touch_begin_y touch_begin_time 按下屏幕时的时间 time 当前时间,long time_sys 系统时间毫秒数 year 年份 month 月份(取值范围是0~11,0表示一月,1表示二月,以此类推) date 日期 day_of_week 星期(1表示星期日,2表示星期一,等等) hour12 当前小时(12小时制) hour24 24小时制 minute 分钟 second 秒 ampm 上下午 0:am 1:pm time_format 0:12h 1:24h year_lunar 农历年份 year_lunar1864 用来计算天干地支 month_lunar 农历月份 从1开始计 month_lunar_leap 0/1 是否润月 date_lunar 农历日期 从1开始计 battery_level 当前电量,1~100 battery_state 0正常 1充电 2电量低 3已充满 screen_width 屏幕宽度 screen_height 屏幕高度 raw_screen_width 物理宽度(这个表示当前设备的屏幕分辨率,不受根节点screenWidth的影响) raw_screen_height 物理高度 image.actual_x 图片实际x坐标 image.actual_y - 6 - touch: battery: ? ? ? image.actual_w 图片实际宽度 image.actual_h image.bmp_width 图片文件的宽度(不受裁切、缩放的影响,只根据src找到指定的图片,并检测该文件的宽度) image.bmp_height music: ? others: ? ? ? ? ? ? ? sms_unread_count 未读短信数 call_missed_count 未接电话数 @next_alarm_time 下一个闹钟时间 intercept_sys_touch 是否截获以后的触摸事件,避免被其他View捕获,例如在自由桌面widget中可以防止在widget上进行触摸操作时桌面滚动和进入编辑模式 frame_rate 当前屏幕帧率 volume_type 0 通话音量 1 系统音量 2 电话铃声,短信铃声 3 音乐播放器音量 4 闹钟音量 5 通知音量 6 连接蓝牙时的通话音量 7 在某些国家强制的系统音量 8 DTMF音量 9 TTS音量 10 FM音量 ? ? ? ? ? ring_mode 0 silent, 1 vibrate, 2 normal wifi_state 0 disabled, 1 enabled, 2 problem, 3 half(intermediate) bluetooth_state 0 off, 1 on, 2 half data_state 0 off, 1 on usb_mode 0 disconnected, 1 charge only, 2 storage, 3 intermediate music_control.music_state 0暂停 1播放 表达式 支持加减乘除取模括号和函数 加减乘除取模 : + - * / % 支持函数:sin, cos, tan, asin, acos, atan, sinh, cosh, sqrt, abs, min, max 不解释 ? ? ? ? ? ? ? ? ? ? ? ? ? ? len(数字) 给定数字位数 len(1234)=4 digit(数字, 第几位) 取给定数字的第几位 digit(1234, 2) = 3 substr(原字符串,字串开始位置,字串长度) substr('今天真热',1,2) = '天真' round() 四舍五入取整 int()向下取整 eq(x, y) // x==y ? 1 : 0 ne(x, y) // x!=y ? 1 : 0 ge(x, y) // x>=y ? 1 : 0 gt(x, y) // x>y ? 1 : 0 le(x, y) // x<=y ? 1 : 0 lt(x, y) // x isnull(x) // x==null ? 1 : 0 // 是否表达式包含空变量,通常用于判断绑定的变量是否查到数据 not(x) x>0 ? 0 : 1 ifelse(x, y, z) // x>0 ? y : z ifelse(x1, y1, x2, y2, ... , z) if x1>0 return y1; else if x2>0 return y2; ... ; else return z - 7 - ? +可以拼接字符串 , 一些函数也可以支持字符串,isnull可以判断字符串变量是否为空,ifelse可以选择字符串,字符串比较函数eqs(@string1, @string2) 元素可见性支持表达式 visibility=“表达式” <=0 不可见 >0可见 Image, Text, Time的属性 align= left, center, right 坐标点水平对齐方式 alignV= top, center, bottom 坐标点垂直对齐方式 文本 显示指定格式的文字,坐标属性支持变量 ? ? ? ? ? ? ? ? ? ? ? ? ? ? color: 文字颜色,#FFFFFF size: 文字大小 format: 如果需要在文字中显示变量数字,需要指定格式, 用%d 指定数字位置 paras: 如果指定了format, 需要在paras里指定%d对应的变量表达式, 可以有多个变量表达式用\隔开 align: left, center, right,文字坐标的对齐方式 textExp: 文字表达式,可以直接调用变量等如想要输出“现在时间是9点”,可以写成textExp=\现在时间是'+#hour12+'点'\ width 文字宽度,当文字超过指定宽度时会被切掉。如果指定了多行显示,则会折行显示。如果指定了文字滚动,则会在指定的位置滚动显示文字 marqueeSpeed 文字滚动速度,配合上面的宽度使用 marqueeGap 滚动间隔。当文字显示完后再次出现的间隔,默认为四个汉字的宽度 rotation(X,Y,Z) 旋转角度,旧的angle也可以使用,不过建议用rotation,因为比较高端大气国际化 multiLine ture/false 是否支持多行显示,默认false spacingMult 行距倍数 默认1 spacingAdd 行距增加量 默认0 text.text_width 某行文本的宽度,可以用来排版 显示下一个闹钟时间 textExp属性支持字符串表达式: *天气信息,如果温度为空显示-- 非空显示数值 y=\w=\size=\color=\align=\ - 8 - textExp=\re) + '℃'\ 时间 < Time x=\ src表示时间图片的前缀,如下表示使用time_0.png, time_1.png, ... time_9.png, time_dot.png. 坐标属性支持变量表达式 space表示时间图片的间隙,我们可以使用这个功能来对时间图片进行排版,使用正值时图片间距变大,这时可以将图片切小,节省内存。对于有投影的图片,将space写成负值,可以使投影重叠以节省空间 日期 显示指定格式的日期 format: 支持标准日期格式, 另外增加农历: NNNN m -> 7 mm -> 07 mmm -> 007 mmmm -> 0007 1970年4月6日 3:23am ? 星期 ? \周三\\星期三\ \纪念日: M/d\纪念日: 4/6\24小时: ? \ - 9 - M -> 9 MM -> 09 \\月d日 h:mmaa\月6日 3:23am\ 图片 图片部件用来在锁屏界面上显示一个图片,可以指定各种属性 慢 ? ? ? ? ? ? srcExp 图片源表达式 srcFormat 图片源格式 srcForamtExp 图片源格式表达式 srcParas 图片源参数 actual_x actual_y 元素实际位置变量,可以获得元素在动画时的实际位置 align/alignV 对齐方式,上文已经介绍。 x,y 相对于屏幕左上角的坐标 w,h 宽和高 pivotX, pivotY 旋转中心 rotation 旋转角度,一周360度 src 图片名称 srcid 图片序列后缀数字,一般用变量表示,可以根据变量显示不同的图片,如果src=\则最后会显示图片 \ alpha 透明度 0-255, 小于等于0不显示 antiAlias true/false 抗锯齿,如果为true图片在变形旋转时不会有锯齿,但是速度会 例子: //srcExp:图片源表达式 数字图片 number是要显示的数字表达式 src是图片源的文件名,支持SourceAnimation - 10 - ? 如果src=\则会使用 number_0.png number_1.png ... 图片文件来绘制数字。类似Time部件 图片遮罩 x,y 坐标 src 遮罩图片,不透明黑色部分表示不透明,其他部分为透明。 align 坐标是相对于所属图片还是绝对位置,如果是相对,图片移动是遮罩会相应跟随移动。否则遮罩保持不动。 遮罩同样可以有源动画,旋转动画,和位置动画,属性支持变量表达式 元素动画 所有元素都支持动画 动画分为:图片源,位置,大小,旋转,透明度 每种动画相互独立,各自循环播放,动画由若干关键帧组成,关键帧包括帧属性和时间,除图片源动画外,其它动画会根据当前时间找到相邻的两个关键帧,然后线性插值计算当前的属性。 如果第一帧时间不从0开始,则默认时间为0的第一帧为图片原始属性,时间单位为毫秒。 位置动画中的位置是相对于图片自身的坐标。 - 11 - 例子:位置动画表示1秒从屏幕最左端到最右端,停留1秒,透明度动画表示开始透明度为175,在从最左端到最右端过程中透明度不变,到达最右端后0.5秒渐变为不透明,然后0.5秒变为透明消失。 然后循环播放。 注意:只有图片支持图片源动画 图片源动画稍有不同,没有插值,x, y 可选,表示相对图片的位置, 当前的图片是在列表里的找到第一个大于当前时间的那个点指定的 - 12 - Slider name: 名字,用来做变量名 bounceInitSpeed, bounceAccelation 回弹动画初始速度和加速度(距离单位为像素,时间单位为秒),都支持表达式 alwaysShow=\默认是false,当一个Slider可见时,其他Slider消失。 可以有任意个Slider部件。 Trigger Slider的状态切换时,支持Trigger触发 Slider起始点:起始点中包含的元素都会跟随当前操作的拖动移动位置。 //从其他状态切换到NormalState时,触发该Trigger //从其他状态切换到PressedState时,触发该Trigger - 13 - //从其他状态切换到ReachedState时,触发该Trigger --> 三个状态都可以不指定,可以使用变量来改变其他界面元素状态来表示触发过程。 Slider目标点:当起始点的x,y点落入EndPoint目标区域矩形时,达到触发位置,此时松开手指即可以产生触发,可以有多个触发目的。 < Intent action=\ - 14 - Slider的intent也可以为Trigger和Command,一个Trigger可以有多个Command。Trigger和Command请见Trigger & Command Unlocker继承Slider,以上用法只需把tag名的Slider改为Unlocker. 解锁部件回弹动画,请见http://www.miui.com/thread-290094-1-1.html 锁屏音效 StartPoint: normalSound, pressedSound ,指定在normal和press状态播放的音效 EndPoint: reachedSound, 到达该endpoint后播放的音效 normalSound=\ 按钮 按钮元素可以用来接收点击,双击等事件,并可根据trigger的定义来控制界面上其他元素。按钮元素也可以将事件传递给界面上其他元素,来使其他元素响应用户在锁屏界面上的操作。 关于命令 - 16 - ... 音乐播放器 ? ? ? ? 指定名称,从而使显示与否可以由另一个按钮控制,比如双击。 必须包含4个Button和1个Text,并且name分别为指定的名称。可以包含其他任意界面元素如Image等。 autoShow true/false 如果在播放音乐时进入锁屏,是否自动显示MusicControl music_state 播放状态 0停止 1播放 更新后音乐播放支持歌名和歌手名字分开显示,分别使用@music_control.title和@music_control.artist 例子:双击控制音乐控制显示隐藏 - 17 - - 18 - 音量调节 ? ? ? ? ? ? ? ? ? ? ? ? ? ? volume_level 现在音量 volume_level_old 调节之前的音量 取值: 1-15 根据二者比较判断是增大还是减小 volume_type 0 通话音量 1 系统音量 2 电话铃声,短信铃声 3 音乐播放器音量 4 闹钟音量 5 通知音量 6 连接蓝牙时的通话音量 7 在某些国家强制的系统音量 8 DTMF音量 9 TTS音量 10 FM音量 一般锁屏下只能调3(音量播放器音量) volume_type>=0 表示正在调节音量,调节完毕后值为-1 可根据这个显示或隐藏音量显示 Content Provider content provider支持where的格式化: where=\ content provider 支持依赖关系,即某个ContentProviderBinder查询结束后获取的变量作为下一个ContentProviderBinder查询的参数 name2查询结束后会触发name1的查询,name1的查询可以使用name2的变量。并且如果name2数据发生变化重新查询后,会触发name1的重新查询。 content provider提供了查询应用程序信息的通用接口,定义了新的xml代码来查询content provider,并查询到的信息绑定到变量上,用来显示第三方应用程序的信息,只要第三方应用提供相应的content provider。比如可以显示天气信息,邮件,待办事项,便签,等等,你也可以写一个应用程序查询任何你想要的信息并通过content provider来提供给锁屏使用。 - 19 - ? ? ? ? ? ? ? ? ? ? ? ? ? VariableBinders: 定义各种变量绑定到的源,目前仅支持content provider。 ContentProviderBinder: 定义一个content provider源和绑定到它上面的变量 uri: content provider uri, 指定选用哪个content provider uriFormat: 如果uri需要添加变量,可以用格式化,需要和uriParas一起使用 uriParas: 同Text element 的格式 columns: 需要查询的列名,用逗号分隔 where: 查询条件,同 SQL args: \的参数. order: 排序条件, 同 SQL countName: 将查询结构数量绑定到该变量名 Variable: 定一个绑定变量 name: 变量名 type: content provider中的数据类型: string/double/float/int/long column: 变量绑定到的列的名称. row: 变量绑定到的行数,默认为0. uriFormat=\er/weather/current/%d\ uriParas=\ columns=\re,description\ countName=\ - 20 - visibility=%ull(#weather_highTemperature))\color=\℃ / %d℃\paras=\ visibility=\weather_highTemperature))\color=\℃ / %d℃\paras=\ visibility=\#weather_highTemperature)\color=\℃ / --℃\paras=\ - 21 - 天气id列表: ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? weather_chance_of_rain = 2130837536; weather_chance_snow = 2130837540; weather_chance_storm = 2130837544; weather_clear = 2130837556; weather_cloudy = 2130837560; weather_flurries = 2130837564; weather_fog = 2130837568; weather_heavy_rain = 2130837572; weather_icy_sleet = 2130837576; weather_mist = 2130837583; weather_partly_cloudy = 2130837587; weather_rain = 2130837600; weather_snow_rain = 2130837606; weather_snow = 2130837608; weather_sunny = 2130837612; weather_thunderstorm = 2130837617; weather_unknown = 2130837621; weather_windy = 2130837626; 查询MIUI便签内容,显示第一条便签内容和修改时间 columns=\countName=\ uri =\columns = \where = \ - 22 - Trigger & Command ? Command 基础命令,可以通过对象名和对象的属性来控制界面里的其他元素。通常控制的是元素的可见性(visibility)和动画播放(animation)。 1. iamge1是被控制对象的名字,“.”后面跟的是属性(目前支持visibility和animation)。 2. 控制可见性的时候,value里面写true或者false,控制动画的时候,value写play(目 前不支持让动画暂停) 3. condition是条件判断,支持表达式。当condition里的条件判断为真时,执行命令;为 假时,不执行。 4. delay是延迟,以毫秒记。读取该命令后延迟一段时间再执行 5. delayCondition是延时判断,在delay的时间之后再进行判断。 例子: // second<40时,延时2000ms执行 expression=\condition=\delay=\/> // 延时6000ms后,如果second<40,执行 expression=\delay=\ // second<40时,延时4000ms,此时如果second<40,执行 VariableCommand - 23 - 变量命令,用来控制变量(Var)的值。包括name和expression两个特殊属性,condition、delay、delayCondition的用法与Command一致 //将屏幕的宽度值赋值给w SoundCommand 声音命令,可以用来播放音频文件 1. sound: 声音文件名 2. volume: 声音大小,0~1的一个浮点数 3. loop: 是否循环播放,true/false,默认是false. 4. keepCur: 播放此音频时,是否保持当前正在播放的声音,true/false,默认false. 例子: // 循环播放reached.mp3,同时不停掉正在播放的其他声音 ExternCommand 通用命令,用来向外部程序发送命令 目前可以使用的一种命令是解锁命令(仅在锁屏中有效) ExternalCommand 与ExternCommand相对,是用来接收外部命令的命令,典型的用法:在锁屏中,通常用来接收开屏/关屏命令,从而执行一些命令;在桌面插件中,用来检测切屏从而执行命令 resume表示开屏时执行的命令,pause表示关屏时执行的命令 - 24 - 桌面插件切屏时使用的示例 蓝牙 value=\ 数据 - 25 - 铃音/静音/震动 三种状态切换 下面和上面同样效果 仅正常和静音切换 仅正常和震动切换 仅切换到静音,用其他button切换到其他状态 USB存储 toggle/on/off Wifi toggle/on/off 用滑动方式实现开关 bounceAcceleration=\ - 26 - ? ? ? ? ? 状态变量,仅在添加相应command后才有效 #ring_mode: 0 silent, 1 vibrate, 2 normal #wifi_state: 0 disabled, 1 enabled, 2 problem, 3 half(intermediate) #bluetooth_state: 0 off, 1 on, 2 half #data_state: 0 off, 1 on #usb_mode: 0 disconnected, 1 charge only, 2 storage, 3 intermediate Trigger的Command支持变量赋值 expression=\offset+#screenview_w,#gesture_offset)\ expression=\_w,#gesture_offset)\ expression=\x_dec,#ani_begin_x_add),#gesture_offset)\ - 27 - 动态帧率 ? 简单用法 除了原来的frameRate属性控制普通状态下的帧率外,还支持分别设置充电、电量低、充满电状态下的帧率,以方便的控制这些状态下的帧率,达到省电的目标。比如普通状态下没有动画,帧率可以设为0,充电状态下有动画,帧率可以设为30,以显示平滑的动画,这样普通状态下就可以非常省电。 例如: frameRateCharging=\frameRateBatteryFull=\? 高级用法 为了在xml描述语言中根据时间线指定不同帧率,新增一种element,叫做 FramerateController,此元素和其他界面元素一样可以被添加到各个容器中,此元素包含一个帧率控制时间线,指定在一定的时间使用一定的帧率。 此元素会控制它所在容器下的时间线的帧率,即,所有该容器下的元素的动画都会与此元素指定的帧率变化同步。 传感器调用 新增 - 28 - type=\ index=0: 方位角,0~359,0=北,90=东,180=南,270=西 index=1: 俯仰角,-180~180,z轴转向y轴为正方向 index=2: 滚转角,-90~90,x轴转向z轴为正方向 type=\ index=0: x方向的线性加速度 index=1: y方向的线性加速度 index=2: z方向的线性加速度 线性加速度是去掉了重力加速度影响的:加速度 = 线性加速度 + 重力加速度 type=\ index=0: x方向的加速度 index=1: y方向的加速度 index=2: z方向的加速度 type=\ index=0: x方向的重力加速度 index=1: y方向的重力加速度 index=2: z方向的重力加速度 - 29 - //气压传感器 type=\ index=0: 气压值,单位hPa。海平面的平均气压是1013.25hPa,可以根据气压值估计海拔高度。 百变锁屏教程 百变锁屏的制作主要分为五个步骤:1. 设计,切图 2. 建立工程 3. 编写manifest(锁屏脚本) 4. 支持个性化设置(可选) 5. 测试。 1. 设计 & 切图 为了能在各种分辨率的设备上都有完美的显示效果,建议分别为480P,720P,1080P等分辨率的设备切图。 2. 建立工程 在主题编辑器生成的工程目录下,创建lockscreen/目录,所有锁屏相关的文件都放置在该目录下。lockscreen/目录的文件结构如下,其中,除了manifest.xml(锁屏脚本)是必选的,其他文件都是可选的。 lockscreen/ |— advance/ . |— manifest.xml (锁屏脚本) . |— 默认分辨率(480P)的图片文件 . |— 声音文件 . |— sw480/ (480P设备上使用的图片都放在该目录下) . |— sw720/ (720P设备上使用的图片都放在该目录下) . |— sw1080/ (1080P设备上使用的图片都放在该目录下) . |— strings/ (如果你想让锁屏支持多语言,在这里添加相应语言的字符串) . |— strings.xml (默认语言) . |— strings_en.xml (英文) . |— strings_zh_TW.xml (繁体中文-台湾) . |— theme_values.xml (主题相关的配置写在这里) 1)多分编率(屏幕宽度)适配的说明 多分编率的适配是系统自动完成的,具体地说:锁屏在被应用的时候,系统会去advance/下寻找相应分配率的图片(swXXX/或默认资源)来显示,比如在720P 上会去寻找sw720/。如果没有相应分辨率的目录,系统会采用与该分辨率最接近分辨率的资源,比如:你有sw720,sw1080两个目录,在800P 的设备上,因为800P与720P最接近,就会使用720P中的图片,然后将其拉伸以适配800P的设备;在500P的设备上,因为500P与 480P(默认分辨率)最接近,所以会使用默认图片资源(advance/目录下的图片),将其拉伸以适配500P的设备。 2)多语言支持(略) - 30 - 3) theme_values.xml 配置在锁屏模式下,状态栏显示哪些信息。文件demo如下: manifest.xml是锁屏脚本文件,描述了图片的布局、动画等效果,是锁屏制作的关键。该脚本采用MAML语言编写(MIUI Application Markup Language,MIUI百变框架自定义的一种语言),其详细语法参考MAML教程 4. 支持个性化设置(可选) 5. 测试 - 31 -