很多開發者通常都會遇到使用者調整系統中的畫面縮放比例,導致APP畫面跑版的問題發生吧?
由於智慧型手機的使用者眾多,且開發者無法限制使用者的行為。
因此跑版會是我們身為開發者,會遇到的難題之一。
這裡會針對使用者調整系統字體大小、或是調整螢幕縮放比例,造成跑版的問題,使用一個簡單的解決方式來處理
先放上程式碼:
object ScaleUtils {
fun attachBaseContext(context: Context): Context {
return if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { // 8.0需要使用createConfigurationContext處理
updateResources(context)
} else {
context
}
}
@TargetApi(Build.VERSION_CODES.N)
private fun updateResources(context: Context): Context {
val displayMetrics = context.resources.displayMetrics
val snap = 20
val exactDpi = (displayMetrics.xdpi + displayMetrics.ydpi) / 2
val dpi = displayMetrics.densityDpi
val resources = context.resources
val configuration = resources.configuration
if (dpi - exactDpi > snap) {
val targetDpi = (ceil(exactDpi / snap) * snap).toInt()
displayMetrics.densityDpi = targetDpi
configuration.densityDpi = targetDpi
displayMetrics.setTo(displayMetrics)
configuration.setTo(configuration)
}
if(configuration.fontScale != 1.0f) {
configuration.fontScale = 1.0f
configuration.densityDpi
}
return context.createConfigurationContext(configuration)
}
}
這個程式碼是一個工具類別,主要是檢查系統的文字大小、畫面縮放比例。
如果手機的縮放比例有發生改變,則讓APP使用系統預設的縮放比例繪製畫面。
至於如何使用,則在Activity中覆寫attachBaseContext方法即可,如下:
override fun attachBaseContext(newBase: Context?) {
if (newBase == null) {
super.attachBaseContext(newBase)
} else {
val newContext = ScaleUtils.attachBaseContext(newBase)
super.attachBaseContext(newContext)
}
}