flex sdk4.5及以上在Application及其子類上提供了ApplicationDpi,并支持3種類型的dpi:160,240,320,基本上可以涵蓋目前已有的設(shè)備的dpi。
如果設(shè)定Application的applicationDpi,flex runtime會(huì)針對矢量圖以及文本自動(dòng)做dpi自適應(yīng),由于矢量圖繪制會(huì)產(chǎn)生痕跡,所以最好在設(shè)計(jì)時(shí)按照低dpi(比如160,Adobe官方建議)來設(shè)計(jì),在dpi=240的設(shè)備上,runtime會(huì)自動(dòng)將矢量圖放到為1.5倍。
對于位圖來說,放大會(huì)導(dǎo)致痕跡,因此flex sdk提供了MultiDPIBitmapSource類,允許用戶針對160,240,320分別提供位圖。mobile app的splash不能采用MultiDPIBitmapSource,最好使用大位圖,讓runtime自動(dòng)縮小它。
在skin中,判斷applicationDpi:
switch (applicationDPI) {
case DPIClassification.DPI_320: {
upBorderSkin = skins.assets320.TransparentRoundedButton_up;
downBorderSkin = skins.assets320.TransparentRoundedButton_down;
break;
}
case DPIClassification.DPI_320: {
upBorderSkin = skins.assets320.TransparentRoundedButton_up;
downBorderSkin = skins.assets320.TransparentRoundedButton_down;
break;
}
在css中,采用@media:
@media (application-dpi: 160) {
Button { fontSize: 20; }
}
}
要提供良好體驗(yàn)的splash,需要擴(kuò)展SplashScreen類,重寫getImageClass方法,比如:
override mx_internal function getImageClass(dpi:Number, aspectRatio:String):Class {
if (dpi == DPIClassification.DPI_160)
return SplashImage160;
else if (dpi == DPIClassification.DPI_240)
return SplashImage240;
else if (dpi == DPIClassification.DPI_320)
return SplashImage320; return null;
}
}
if (dpi == DPIClassification.DPI_160)
return SplashImage160;
else if (dpi == DPIClassification.DPI_240)
return SplashImage240;
else if (dpi == DPIClassification.DPI_320)
return SplashImage320; return null;
}
}