iphone6的切图如何适配Android?

Android 屏幕适配是Android工程师最最头疼的一件事情了。最近公司的项目中就需要引入屏幕适配的工作,但是,UI及尺寸是基于iPhone6的,那么如何做到显示效果上能够更加的接近设计图呢?

下面我将在最小限度的不更改源代码的情况下,使用屏幕分辨率限定符的形式进行Android屏幕的适配方式的介绍
一、 将iPhone6的尺寸与Android sw360dp 进行换算

通常我们需要UI设计基于1920*1080的设计稿,宽度为360dp,将切图的三倍图放置xxhdpi,如果标注是px,那么我们自动除以3作为dp,如果直接是dp那我们直接拿来使用。

手机屏幕分辨率宽度DP(heightPixels/density)
iPhone61334*750375pt
小米61920*1080360dp
华为荣耀8X2045*1080360dp
锤子坚果Pro22070*1080432dp

假设:UI设计师以iPhone6为基准,标注中有一个为375pt宽的控件,实际像素为750px,如果我们直接用375dp拿到我们Android设备上,则 小米6、华为荣耀8X这两款手机会超出屏幕,而锤子坚果Pro2会小于屏幕,因此如果直接拿到标注进行设置,那么在锤子坚果Pro2手机上所有的控件都会显得比较小,而小米6略显一点大。
因此我们换算iphone6与我们基准的360dp进行换算,得出更加近似的dp值:

手机标注(换算)换算公式
iPhone61pt375/375=1
小米60.96dp360/375=0.96
华为荣耀8X0.96dp360/375=0.96
锤子坚果Pro21.152dp432/375=1.152
一、我们先使用Python对1~600常用的数值进行生成
from xml.etree import ElementTree as ET
if __name__ == '__main__':
    resources = ET.Element("resources")
    for i in range(1, 601):
        dimen = ET.SubElement(resources, "dimen")
        dimen.attrib = {"name": "pt_" + str(i)}
        dimen.text = str(round(i * 0.96, 4)) + "dp"
    ET.ElementTree(resources).write("dimens.xml")

dimens.xml

<resources>
    <dimen name="pt_1">0.96dp</dimen>
    <dimen name="pt_2">1.92dp</dimen>
    <dimen name="pt_3">2.88dp</dimen>
    <dimen name="pt_4">3.84dp</dimen>
    <dimen name="pt_5">4.8dp</dimen>
    ....
</resources>
二、将dimens.xml或者里面的dimens复制到Android工程values下

我们可以在此目录下编写我们其他自定义的一些dimens,例如:

<resources>
    ....
    <item name="main_taotao_scale" format="float" type="dimen">0.244</item>
    <item name="home_play_scale" format="float" type="dimen">0.25</item>
    <item name="main_taotao_left_back" format="integer" type="dimen">16</item>
    <item name="new_main_taotao_left_back" format="integer" type="dimen">24</item>
    ....
</resources>
三、正常的使用

在xml布局文件中:

 <ImageView
    android:id="@+id/main_taotao_tell_bac"
    android:layout_width="@dimen/pt_124"
    android:layout_height="@dimen/pt_129"
    android:scaleType="fitXY"
    android:src="@drawable/main_taotao_tell_bac_phone"
    app:layout_constraintDimensionRatio="372:387" />

在kotlin文件中:

context.resources.getDimension(R.dimen.pt_124)
四、屏幕分辨率限定符文件的生产

如果项目已经开发基本完成,不再添加新的dimens值,此时可以生成不同分辨率限定符文件,Python代码:

from xml.etree import ElementTree as ET
import os
if __name__ == '__main__':
    array = [384, 392, 400, 410, 432, 480]
    for a in array:
       resources = ET.Element("resources")
       path = 'values-sw' + str(a) + 'dp'
       if not os.path.exists(path):
           os.makedirs(path)
       for e in ET.parse("dimens.xml").getroot():
           tag = e.tag
           t = e.text
           dimen = ET.SubElement(resources, tag)
           if tag == 'dimen':
               dimen.attrib = {"name": e.attrib['name']}
               dimen.text = str(round(float(t[0:-2]) * a / 360, 4)) + "dp"
           else:
               format = e.attrib['format']
               if format == 'integer':
                   dimen.text = str(int(round(float(t) * a / 360, 0)))
               else:
                   dimen.text = str(round(float(t) * a / 360, 4))
               dimen.attrib = {'name': e.attrib['name'], 'format': format, 'type': e.attrib['type']}
       ET.ElementTree(resources).write(path + "/dimens.xml")

代码中,array数组中的值选取大于360dp,常用的手机就是代码中数组中的值,运行代码后会生成多个values-sw***dp的文件夹:

将这些文件直接复制到Android工程res文件夹下。

适配结束。表述不清楚或错误的地方,欢迎指正。欢迎关注,技术交流。leefeng.me

五、适配前后对比

设计稿:

适配后(锤子坚果Pro2):

适配前(锤子坚果Pro2):

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

leefeng.top

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值