AndroidAutoSize
AndroidAutoSize copied to clipboard
关于Compose的适配和源码的其他几处疑问
Environment
- [x] Autosize Version: 1.2.1
- [x] Target Android Version: 不重要
- [x] Device Model: 不重要
- [x] Device Resolution: 不重要
- [x] Design Size On AndroidManifest: 不重要
一直以来都是使用AndroidAutoSize进行屏幕适配,也都一如既往的好用,期间并没有去关注源代码实现,直到最近开始接触使用Compose UI开发,使用一段时间并没有觉得有何不妥,之前也进行过了测试确认dp单位的计算,直到测试组有反馈字体问题,具体表现为受系统字体影响无法解决(目标需求不受系统字体影响),当系统字体有缩放时,Componse 使用sp单位的字体会同步系统字体,并且设置AutoSizeConfig.isExcludeFontScale无效。
源代码分析原因: AndroidAutoSize字体上处理为displayMetrics.scaledDensity 修改 但Compose源码获取context.resources.configuration.fontScale --------------------------compose包源码--------------------------------- package androidx.compose.ui.unit
import android.content.Context
/**
- Creates a [Density] for this [Context].
- @param context density values will be extracted from this [Context] */ fun Density(context: Context): Density = Density( context.resources.displayMetrics.density, context.resources.configuration.fontScale <------------ 为什么AndroidAutoSize无法屏蔽系统字体缩放得原因 )
//----------------转换函数---------------------------------- @Stable fun TextUnit.toPx(): Float { check(type == TextUnitType.Sp) { "Only Sp can convert to Px" } return value * fontScale * density }
--------------------------compose包源码--------------------------------- 所以适配Compose时AutoSize应该需要一点点修改,有时间我fork一下
其他阅读源码疑问:
- 为什么ActivityLifecycleCallbacksImpl中onActivityCreated和onActivityStarted重复两次mAutoAdaptStrategy.applyAdapt(activity, activity);
- 为什么AutoSize在修改activity上下文同时每次修改Application的DisplayMetrics,不知道是不是这个影响了我下面的这个问题,最近在对接头条广告SDK时,插屏广告被框架影响,使用前已经了解了插屏在哪里桩位的activiy里,并且使用ExternalAdaptManager进行了屏蔽(日志也确实打印了...canceled the adaptation!),结果插屏UI适配失效,在调用广告之前热关闭框架功能也处理不了插屏移位的问题(不知道是不是有更深层的原因,导致上下文DisplayMetrics没有处理完成),经过测试,只有在调用广告处的Activity取消了适配(热插不起作用),头条广告UI才不会位移,但是我觉得不应该,因为该广告显示在另一个Activity层,并且不是一个Dialog。目前没有找到原因,只能调用处实现CancelAdapt
你好,老项目中使用副单位pt,现在想把compose混合进去开发,是不是还得自己生成一个单位。原设计图为1080*1920. 这个写法是否正确。谢谢!
const val DESIGN_WIDTH = 1080
val Number.pt get() = Resources.getSystem().displayMetrics.run { val dp = widthPixels / density Dp((toFloat() * dp / DESIGN_WIDTH)) }
投条最新插屏广告黑屏大家有遇到过吗?!