二、适配可行性
(2)屏幕密度:单位dpi,指的是每inch上可以显示多少像素点即px。
(5)刻度无关像素:单位sp,指的是自适应字体的像素,用于指定文字大小。
(1)16:9的4.5寸屏幕由勾股定理计算其高约为3.9寸,宽约为2.2寸
那么既然dpi是自适应屏幕密度的,与px之间又是如何换算呢:
213dpi(tvdpi电视密度屏) 1dp = 1.33px
由上述分析结果可知,控件使用dp,文字使用sp即可满足自适应的需求。
那么如何根据这三个属性来进行适配呢?Android在资源文件values用文件名的方式提供了限定符可以帮助我们判断上述情况,限定符(mdpi,tvdpi,hdpi)可以帮助我们判断屏幕密度,限定符(land,port)可以帮助我们区分屏幕横竖屏状态,而限定符(1024x600...)可以适配计算虚拟键或者不计算虚拟键的屏幕,限定符的详细说明请参见Android SDK文档中开发者指南的Supporting Multiple Screens话题。
注1:分辨率限定符的匹配是向下匹配,如果没有values-land-mdpi-1024x552,比如,分辨率values-land-mdpi-1024x600的屏幕,当rom不把虚拟键计算到屏幕尺寸时,实际显示的屏幕应该是values-land-mdpi-1024x552,无法适配到values-land-mdpi-1024x600,那这样就可能适配到下一级,比如values-land-mdpi-800x480,但是现在的平板已经没有这么低的分辨率了,所以是配到无限定符的values-mdpi里,造成界面显示上的瑕疵。
package com.wscq; import java.math.BigDecimal; import java.util.Iterator; import org.dom4j.Attribute; import org.dom4j.Document; import org.dom4j.Element; import org.dom4j.io.SAXReader; public class ChangeDimensValue { public static void main(String[] args) throws Exception { ReadAndChange(); } private static void ReadAndChange() throws Exception { String path = ChangeDimensValue.class.getResource("/dimens.xml").getPath(); SAXReader reader = new SAXReader(); // 读取xml文件内容,在内存中生成dom树 // Document对象doc是树根 Document doc = reader.read(path); Element email = doc.getRootElement();// 获得根元素 // 测试迭代器遍历下层元素 iterator(email); } private static void iterator(Element email) { StringBuffer sb = new StringBuffer(); // e.elementIterator()获得下层元素迭代器 Iterator<Element> it1 = email.elementIterator(); sb.append("<?xml version=\"1.0\" encoding=\"utf-8\"?>"); sb.append("<resources>"); while (it1.hasNext()) { Element e = it1.next(); sb.append("<" + e.getName()); Iterator<Attribute> itt = e.attributeIterator(); Attribute att = itt.next(); sb.append(" " + att.getName() + "=" + att.getValue()); sb.append(">"); // 此处的倍数为缩放倍数,这里是720*1280变换为480*800 sb.append(toMULNumber(e.getText(), new BigDecimal("0.82"))); sb.append("</" + e.getName() + ">"); } sb.append("</resources>"); System.out.println(sb.toString()); } private static String toMULNumber(String num, BigDecimal d) { BigDecimal bigDecimal = new BigDecimal(num.substring(0, num.length() - 2)); bigDecimal = bigDecimal.multiply(d); int number = bigDecimal.intValue(); return number + num.substring(num.length() - 2, num.length()); } }