技術學習記錄

[Android]關於系統縮放比例造成畫面跑版的一個解法

很多開發者通常都會遇到使用者調整系統中的畫面縮放比例,導致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)
    }
}

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *