大标题应该写啥?
怎么说呢,屏幕适配的方案很多种,我这边就说一种吧,思路是之前公司的老代码(不得不说,屎一样的老代码也总是能给我惊喜),没想到跟鸿洋大神的适配方案不谋而合。大家凑合看吧
基本概念
-
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大小有严格要求,其实也不会加很多,所以凑合用用就行。