Android精确适配不同的dpi和屏幕尺寸(附dimens按比例变化数字的工具类)

二、适配可行性

  (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里,造成界面显示上的瑕疵。


<p ms="" song',宋体,arial,微软雅黑,helvetica,sans-serif;="" line-height:21px"="" style="box-sizing: border-box; margin-top: 0px; margin-bottom: 10px; color: rgb(51, 51, 51); font-family: Roboto, Helvetica, Arial, sans-serif; font-size: 14px; line-height: 20px;">附:dimens值按比例缩放工具:<p ms="" song',宋体,arial,微软雅黑,helvetica,sans-serif;="" line-height:21px"="" style="box-sizing: border-box; margin-top: 0px; margin-bottom: 10px; color: rgb(51, 51, 51); font-family: Roboto, Helvetica, Arial, sans-serif; font-size: 14px; line-height: 20px;">
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());
	}
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值