android动画鸿阳,Android屏幕适配,目前完美

描述

Android开发最经常遇到也是一个比较烦人的问题就是UI的适配问题了。

比如:

1、最常见的就是在小米手6适配好了之后,测试用了一个OPPO R9测试,发现你的控件比小米手机显示的的要宽。

2、还有就是明明是同样的尺寸,同样的分辨率的手机手机宽度的dpi竟然也不相同.....

030161676155

图0

造成上面的问题主要是不同尺寸、分辨率、系统的rom不同造成的,以下是我的一些测试:

红米note 分辨率:1280720 / 尺寸:5.5 / dpi:360

三星s7 分辨率:25601440模式 / 尺寸:5.1 / dpi:360

三星s7 分辨率:19201080模式 / 尺寸:5.1 / dpi:360

乐视2 分辨率:19201080 / 尺寸:5.5 / dpi:411

OPPO R9 分辨率:19201080 / 尺寸:5.5 / dpi:360

华为mate9 分辨率:19201080 / 尺寸:5.9 / dpi:393

小米max2 分辨率:19201080 / 尺寸:6.44 / dpi:392

小米5 分辨率:19201080 / 尺寸:5.1 / dpi:360

这里的dpi代表屏幕的宽有多少dp

我们先聊聊我自己的适配历程吧

第一阶段

030161676155

图1

我选择了 Android studio里 pixel2 和 nexus 5x两个当做基准,使用 px=dp(dpi/160) 使用算出了一套方案

030161676155

图2

030161676155

图3

当时的文件找不到了,里面的数值可能不对哈,包含一下

就这样使用了一段时间,也没有出现什么大问题,但是每当遇到一些精细一些的布局时就会发现总是会出现误差,就得使用一些其他的方法来弥补(修改一些值,强烈不推荐)

第二阶段

第一阶段的升级,根据屏幕的分辨率增加了几个适配方案

030161676155

图4

虽然增加了不同分辨率的适配但是开始的问题2还是没有解决啊,该出现的问题还是出现

第三阶段

手机屏幕的适配主要还是宽度的适配

smallestWidth适配,或者叫sw限定符适配。指的是Android会识别屏幕可用高度和宽度的最小尺寸的dp值(其实就是手机的宽度值),然后根据识别到的结果去资源文件中寻找对应限定符的文件夹下的资源文件。

和我的第二阶段原理上是一样的都是根据系统的规则来选择对应的文件,但是第二阶段如果碰见屏幕不是很正常的分辨率(比如现在的一大波全面屏)时就得向下寻找可能本来1080p的手机用了720p的适配方案(打个比方)。

通过我开始的测试发现大多数的手机横向的dpi都是360(包括720p屏幕)

smallestWidth适配的好处就是,如果找不到对应的value-sw文件就会向下寻找最近的适配,由于大多数手机都是宽度的dpi都360,我们就围绕360左右来做几套方案

030161676155

图5

其实现在小于360dpi的手机暂时还没有发现,360以下的只做了两个,360以上的做的多一些,再多的话就有些浪费空间了,毕竟一个文件也有好几十kb了,通过以上方法几乎完美的解决了我碰见的适配问题

参考文章

下边是我在上述描述中用到的一些方法

1、获取手机宽度的dpi

DisplayMetrics dm = getResources().getDisplayMetrics();

int width = dm.widthPixels;

int dp = DisplayUtil.px2dip(this,width);

Log.d("onCreate", "dp: " + dp);

2、一键生成适配文件

public class AndroidValuesDpXml {

private final static String rootPath = "C:\\layoutvalues\\values-sw{0}dp\\";

private final static String WTemplate = "{1}dp\n";

private final static float dw = 1080;

public static void main(String[] args) {

screenString(320);

screenString(340);

screenString(360);

screenString(370);

screenString(380);

screenString(390);

screenString(400);

screenString(410);

screenString(420);

}

public static void screenString(int w) {

StringBuffer sb = new StringBuffer();

sb.append("<?xml version=\"1.0\" encoding=\"utf-8\"?>\n");

sb.append("");

float dpi = dw / w * 160;

for (int i = 1; i < 1081; i++) {

sb.append(WTemplate.replace("{0}", i + "").replace("{1}",

change(i/(dpi/160)) + ""));

}

// sb.append(WTemplate.replace("{0}", "320").replace("{1}", w + ""));

sb.append("");

String path = rootPath.replace("{0}", w + "");

File rootFile = new File(path);

if (!rootFile.exists()) {

rootFile.mkdirs();

}

File layxFile = new File(path + "dimens.xml");

// File layyFile = new File(path + "lay_y.xml");

try {

PrintWriter pw = new PrintWriter(new FileOutputStream(layxFile));

pw.print(sb.toString());

pw.close();

} catch (FileNotFoundException e) {

e.printStackTrace();

}

}

public static float change(float a) {

int temp = (int) (a * 100);

return temp / 100f;

}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值