主题文章

> 教程

【官方秘籍】MAML动态图标&百变插件完美适配全机型教程

发布时间: 2016-01-27 11:29

一份manifest文件,可以同时运行在多个设备,只需要设置好在不同尺寸或密度的设备上使用的资源和缩放比例就可以了。

资源适配:
extraResources=”sw1000-den320:den320:1.2,sw1000-den320::1.2,sw1000-den320-large:den320:1.2″
每一项用逗号隔开,即不同的机型之间用逗号隔开,每一项内部通常用两个冒号隔开,第一个冒号之前是对机型的描述,两个冒号之间是对所用资源的描述,第二个冒号之后描述的是对所用资源的缩放比。这里说的资源就是图片,对资源的缩放就是在不同的机型上缩小放大图片。
sw1000-den320:den320:1.2这一项的意思是在屏宽是1000密度是320的机型上,使用的是den320文件夹下的资源,并且放大1.2倍;
sw1000-den320::1.2这一项中两个冒号之间是空白,意思是在屏宽1000密度320的机型上,使用的是默认的资源,并且放大1.2倍。

extraResources=”sw2000-den480:1.8,sw1000-den320-large:1.8″ 
上面这两项内部都只有一个冒号,意思是sw2000-den480的机型使用的资源就是在sw2000-den480这一同名文件夹下的资源,并且放大1.8倍。
在资源适配的描述中,对机型的描述格式必须是swXXX-denXXX,否则无法生效。

布局适配:
布局适配是对XML中的所有的坐标和尺寸的适配,每一项依然用逗号隔开,但是每一项内部都只用一个冒号分割,因为布局适配无需指定资源,所以冒号之前是对机型的描述,冒号之后是缩放比,这里的缩放比通常是和资源的缩放比一致的。
extraScaleByDensity=”320:1.2,480:1.8″
extraScaleByDensity的意思是根据密度缩放,第一项的意思是在密度是320的机型上对布局的缩放是1.2,即所有的坐标和尺寸都要放大1.2倍。
extraScaleByScreenWidth=”720:1.2,1280:1.8″这是根据屏宽缩放。
extraScales=”sw1000-den320:1.2,sw2000-den480-large:1.8″,这是根据屏宽和密度缩放。

适配原理:
首先把你所有自定义中出现的den和sw做一个列表 (比如这里extraResources=”sw1440-den440::0.916, sw720-den320::0.667, sw480-den240::0.444″,涉及到的den有440, 320, 240, 再加上一个默认的480; sw有1440, 720, 480, 再加一个默认的1080(与den480对应) )
然后当你的主题放到一个设备上时,首先拿你的设备密度去上面的den列表中找,找到最贴近的一个,然后如果同样den有多个sw,那么再拿设备的屏宽去这几个sw中找最贴近的一个,这样就找到了最合适的swXXX-denXXX
最后,资源就取这个sw-den对应的目录下的资源,及缩放比例Sr。代码中数字的缩放比例就使用sw-den对应的Ss.
最最后,就是缩放比例
a) 如果按密度缩放(即scaleByDensity=”true”):资源真正的缩放比例是Sr * 设备den (找到的den),代码中的数字缩放比例是Ss * 设备den(找到的den)
b) 如果按屏宽缩放(即scaleByDensity=”false”):资源真正的缩放比例是Sr * 设备sw (找到的sw)  ,代码中的数字缩放比例是Ss * 设备sw(找到的sw)


下面用一个动态图标举例:
<Icon version=”1″ frameRate=”0″ width=”192″ height=”192″ useVariableUpdater=”DateTime.Second” resDensity=”480″ extraResources=”sw720-den320::0.705,sw1080-den440::0.882,sw2000-den640::1.176″ extraScales=”sw720-den320:0.705,sw1080-den440:0.882,sw2000-den640:1.176″>//这里所用的资源都是默认资源,默认资源的意思是在com.android.calendar这个动态日历的文件夹下只有一套资源,并且是直接放在这个文件夹下的。resDensity=”480″的意思是下面的代码都是根据密度是480的机型写的,即屏宽是1080的机型,所以这句话也可以换成screenWidth=”1080″。
     <VariableBinders>
        <BroadcastBinder action=”android.intent.action.TIME_SET” />
        <BroadcastBinder action=”android.intent.action.DATE_CHANGED” />
     </VariableBinders>
     <Group pivotX=”96″ pivotY=”96″>
         <Image x=”96″ y=”96″ align=”center” alignV=”center” src=”calendar_icon.png” srcid=”#date” />
     </Group>//如果在密度是640的设备上,pivotX,pivotY,X和Y都会放大成原来的1.176倍来适配设备,这就是布局适配。
</Icon>

再举一个例子:
<Icon version=”1″ frameRate=”18″ width=”192″ height=”192″ resDensity=”480″ extraResources=”sw720-den320:den320:1,sw1080-den440:den480:0.882,sw1080-den480:den480:1,sw2000-den640:den480:1.176″ extraScales=”sw720-den320:1,sw1080-den440:0.882,sw1080-den480:1,sw2000-den640:1.176″>//这里所用的资源都是来自den320文件夹和den480文件夹,即在com.android.deskclock这个动态时钟文件夹下建两个文件夹,分别叫den320和den480,里面放相应资源。
     <Image name=”hand_hour” x=”96″ y=”53″ align=”center” pivotX=”4″ pivotY=”43″ src=”hour.png” rotation=”#hour_angle_raw” antiAlias=”true”/>
    <Image name=”hand_minute” x=”96″ y=”49″ align=”center” pivotX=”8″ pivotY=”47″ src=”minute.png” rotation=”#minute_angle_raw” antiAlias=”true”/>
</Icon>

百变图标附件下载:icons.zip



亲,你需要登录后才能对该作品进行评论喔!

登录 立即注册