Android 简单易懂的屏幕适配方案

Android 简单易懂的屏幕适配方案

大标题应该写啥?

怎么说呢,屏幕适配的方案很多种,我这边就说一种吧,思路是之前公司的老代码(不得不说,屎一样的老代码也总是能给我惊喜),没想到跟鸿洋大神的适配方案不谋而合。大家凑合看吧

基本概念

  • px:像素,屏幕上一个一个的小点点

  • dp:Android 常用的控件大小单位

  • sp:Android 常用的文本大小单位,跟dp不同的是,会随着系统设置的字体大小进行变化

  • dpi:(dots per inch)屏幕像素密度,英文一看就知道,就是指每英寸屏幕的像素值

    谷歌官方文档上规定,在160dpi
    1dp = 1px

    由公式 px = (dpi / 160) dp 可以看出dpi越大,1dp表示的像素就越多

SW适配

SW全称是Smallest Width,表示最小宽度,如果说我某个手机计算得出的sw是400,但是我文件中只有380 和 420,那么就会取380文件夹下的dimens值。

具体这个sw值是怎么计算的呢

上面我们不是说到,px = (dpi / 160) dp ,也就是说dp = px / (dpi / 160),

举个例子,我有一台 1080 x 1920 : 420dpi 的设备,那么取他的宽度(一般都是取宽度,因为sw表示最小宽度),也就是1080,然后取他的dpi,也就是420,利用公式计算出

dp = 1080 / (420 / 160) = 411

那他就会向下取寻找合适的sw文件

我们平时使用的过程中,可能需要适配不同的手机,所以会有很多个value文件夹,为了方便,写了个生产的类,直接运行就行。

import java.io.File
import java.io.FileWriter

object DimenTool {
    @JvmStatic
    fun main(args: Array<String>) {

        val stringBuilder = StringBuilder()

        for (swValue in 300..800 step 20) {

            // 1. 生成需要的string
            stringBuilder.clear()
            buildStringBySwValue(stringBuilder, swValue)


            // 2. 写入文件
            val file = File("./app/src/main/res/values-sw${swValue}dp/dimens.xml")
            val string = stringBuilder.toString()
            writeFileFromString(file, string)

            // 对默认的处理
            if (swValue == 320) {
                writeFileFromString(File("./app/src/main/res/values/dimens.xml"), string)
            }
        }
    }


    private fun buildStringBySwValue(stringBuilder: StringBuilder, swValue: Int) {
        // 添加头部
        stringBuilder.append("<?xml version=\"1.0\" encoding=\"utf-8\"?>\n")
        stringBuilder.append("<resources>\n")

        // 添加内容(dp)
        for (dpValue in 1..1000) {
            stringBuilder.append("    <dimen name=\"view_$dpValue\">${(dpValue * swValue).toDouble() / 320}dp</dimen>\n")
        }

        // 添加内容(sp)
        for (spValue in 1..50) {
            stringBuilder.append("    <dimen name=\"text_$spValue\">${(spValue * swValue).toDouble() / 320}sp</dimen>\n")
        }

        // 添加尾部
        stringBuilder.append("</resources>\n")
    }

    private fun writeFileFromString(file: File, string: String) {
        try {
            if (file.exists()) {
                file.delete()
            }
            file.parentFile?.mkdirs()
            file.createNewFile()
            FileWriter(file).apply {
                write(string)
                flush()
                close()
            }
        } catch (e: Exception) {
            e.printStackTrace()
        }
    }
}

sw的方式适配起来简单,但是会增加apk的包的大小,不过实际项目中,如果不是对apk大小有严格要求,其实也不会加很多,所以凑合用用就行。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值