AndroidAutoSize icon indicating copy to clipboard operation
AndroidAutoSize copied to clipboard

关于Compose的适配和源码的其他几处疑问

Open lanjd opened this issue 3 years ago • 2 comments
trafficstars

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一下

其他阅读源码疑问:

  1. 为什么ActivityLifecycleCallbacksImpl中onActivityCreated和onActivityStarted重复两次mAutoAdaptStrategy.applyAdapt(activity, activity);
  2. 为什么AutoSize在修改activity上下文同时每次修改Application的DisplayMetrics,不知道是不是这个影响了我下面的这个问题,最近在对接头条广告SDK时,插屏广告被框架影响,使用前已经了解了插屏在哪里桩位的activiy里,并且使用ExternalAdaptManager进行了屏蔽(日志也确实打印了...canceled the adaptation!),结果插屏UI适配失效,在调用广告之前热关闭框架功能也处理不了插屏移位的问题(不知道是不是有更深层的原因,导致上下文DisplayMetrics没有处理完成),经过测试,只有在调用广告处的Activity取消了适配(热插不起作用),头条广告UI才不会位移,但是我觉得不应该,因为该广告显示在另一个Activity层,并且不是一个Dialog。目前没有找到原因,只能调用处实现CancelAdapt

lanjd avatar Apr 12 '22 17:04 lanjd

你好,老项目中使用副单位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)) }

MoYuFly avatar Jun 10 '22 09:06 MoYuFly

投条最新插屏广告黑屏大家有遇到过吗?!

longxuewei avatar Aug 10 '23 02:08 longxuewei