-
Notifications
You must be signed in to change notification settings - Fork 2k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
使用副单位适配出现的问题 #82
Comments
AndroidAutoSize 默认可以同时支持 DP 和 副单位这没错,但是 dp 和 副单位必须使用同样的设计图值,意思是,如果你 manifest 填写的设计图尺寸是 1080 * 1920,布局中如果有一个 View 刚好占屏幕宽度的一半,在使用 DP 布局时,这个 View 的宽度应该是填写 540dp,如果使用副单位布局,这个 View 的宽度也应该填写 540mm,如果你使用副单位布局时用的是 540mm,但当你使用 dp 时,你将这个值根据 dp 转 px 的公式除以 2 或者 3 那肯定是错的,这时布局会很小 同理如果你在 manifest 中填写的设计图尺寸是 360 * 640(根据px 转 dp 公式),布局中如果有一个 View 刚好占屏幕宽度的一半,那不管你使用什么单位,这个 View 的宽度值都应该是 180,如果你使用 dp 布局时,用的是 180 dp,用副单位时却没有按照 px 转 dp 公式除以 3,继续使用 540mm,那这也是错的,这时布局会偏大 |
看你的截图,很明显你在 manifest 中填写的设计图尺寸是没有转成 dp 的,可能直接使用的是 1080 * 1920,所以旧页面会偏小,其实也不用每个页面都实现 CancelAdapt,实现 CancelAdapt 意味着放弃适配,可能你没认真看文档和 demo,使用一下全局设置即可放弃 dp 和 sp 的支持,也就是放弃适配 dp 和 sp AutoSizeConfig.getInstance().getUnitsManager()
.setSupportDP(false)
.setSupportSP(false); 这时你的新页面就可以继续使用 1080 * 1920 进行布局,不用再将 px 转成 dp 但上面的操作意味着你放弃了对旧项目的适配,如果你不想放弃,那 manifest 中的设计图尺寸就需要将 px 转成 dp,比如 360 * 640,并且在你使用副单位时,也必须同样将布局中的尺寸都根据 px 转 dp 的公式将 px 换算成 dp |
好的,之前也是细心看了demo的。看了您的回答,有了新的认识,刚才也换算成dp填写到manifest中,旧项目的UI也正常显示了。 |
好的👌 |
您好,回顾一下issues后今天在写项目的时候发现一个问题,一开始在manifets填写px不能兼容旧项目,然后将manifest将px换算成dp填写,能够兼容旧项目的dp,这个操作不就意味着我变成了主单位了吗?那我干嘛不直接以这个dp为主单位来继续写项目呢?应该就不需要用副单位的情况了呀,那副单位的存在意义何在呢? = = 不是很理解这个问题。希望您能解答一下疑惑。 |
顺便一提一个预览图的问题,希望帮助到其他用户。我的设计图分辨率为1125x2436,换算成dp是375x812。然后是遇到的预览图的问题,因为项目中有旧的dp,也有新的pt,dp和pt是不同界面,没有在同一xml使用两种单位。按理说,根据您的模拟器的创建方式,我应该创建2个模拟器才分别预览对吧,然后我创建了1125x2436的dp模拟器,也创建了1125x2436的pt模拟器,发现dp预览显示是正常的(这本来就是对的,因为我manifest填写的是dp,现在相当于是主单位的情况下嘛)。然而我在副单位下的xml,不能用pt的模拟器正常预览,显示效果变大很多。这里说一下,只是预览不行,我运行到手机后,dp单位和pt单位的两个activity展示是没有问题的。也希望大佬能够解答一下我的疑问。 |
这个问题我已经找到解决办法,manifest中填写的是dp,那么在创建dp模拟器就正常用设计图分辨率的算法来创建。副单位的模拟器注意了,需要用manifest中的设置宽高来计算,而不是设计图的分辨率,如我的dp是375x812,那么pt的模拟器就是√((375)²+(812)²)/72 这样创建出来的模拟器可以正常显示副单位pt的xml。 |
这个问题可以解决,又回到了一开始提出的问题。因为现在manifest设置的是375x812,我dp的头像用的宽75dp,高75dp。我pt的头像也是用宽75pt,高75pt。他们显示效果一模一样。 那我干嘛用pt而不直接用dp,那副单位的意义又如何体现。。。(⊙o⊙)… 感觉我被绕进了一个奇怪的地方。 |
你对副单位的认知上有一定问题,副单位的诞生,本身就不是为了解决直接使用设计图上的 px 标注进行布局,如果你想,哪怕你使用 dp 进行布局也可以像副单位一样直接填写设计图上的 px 尺寸,使用副单位的最大的原因,是因为副单位不会影响其他三方库或系统控件,因为修改 denisty 是全局,所以整个项目所有使用 dp 布局的控件都会被影响,当系统控件或三方库的设计图尺寸和 manifest 中填写的不一样,那系统控件或三方库就会出现显示太大或太小的问题,导致不能很好的适配,但副单位的原理不是修改 denisty,所以我们只要我们关闭对 dp 的支持 setSupportDP(false),自己在项目也不使用 dp,而是使用副单位,那所有三方库就和系统控件就不会被影响,除非他们里面也是用副单位进行布局 使用副单位可以直接填写设计图上的 px 尺寸,只是因为上面的问题得到解决后所附带的功能,这个附带的功能使用 dp 布局时也是支持的,你现在把 manifest 的设计图尺寸和布局中的 dp,全部通过公式换算成 px 适配效果和之前没有任何区别,你可以试试,但是如果你这样做,所有三方库和系统控件的显示都会变小,为什么?因为上面的问题没有被解决,所以我不提倡使用 dp 布局时这样做,副单位就是因为解决了上面的问题,所以可以随意的填写设计图上的 px 标注,而不怕影响三方库和系统控件,这点我在我的 文章 中有讲,你可能你没认真看 |
从目前的情况来讲,也就是说,1.如果大家是旧项目接入本库,准备直接使用副单位来进行适配,在manifest中就不应该填写设计图的px,而是先将px换算成dp后填写到manifest中。然后在所有的新界面中,也是用换算过来的dp值后用副单位来填写。副单位最大的意义是为了不影响第三方控件中。等用副单位慢慢替换旧项目的dp值之后,再开启setSupportDP(false)来关闭对dp的支持,避免影响第三方控件。2.如果是新项目,可以一开始全部使用dp作为主单位,在manifest中填写dp,xml也用dp,只是可能要去处理一些第三方控件的显示问题 3.如果是新项目,也可以一开始全部只使用副单位,在manifest中填写px,然后布局中也是用副单位来填写对应px的值。我这样的理解没有错吧? |
我的问题似乎有点头目,我现在细心阅读一下您的文章,因为之前也一直看了几遍,只是没有细心。 |
你这样的理解是对的,因为我觉得如果是旧项目,保持之前的屏幕适配方式不变,新页面使用 AndroidAutoSize 进行适配,等有时间的时候,在将旧页面慢慢切换为 AndroidAutoSize,但你的需求是旧页面没有用其他屏幕适配方案,直接使用的 dp,所以也想用 AndroidAutoSize 进行适配,新页面也想用 AndroidAutoSize 的副单位进行适配,因为框架中只保留了一个设计图尺寸,所以不管是 dp 还是副单位都是用的同一个设计图尺寸进行计算的,所以你也就出现了�上面的解决方案, dp 和 pt 都使用同一个值,你的需求想要想解决,就必须框架中保留两个设计图尺寸,主单位一个,副单位一个,但这样也存在一些问题,复杂度,和框架结构都要变 |
好的,现在心中的疑惑也基本解决,刚才测试了一下,在同一个xml中,可以sp,dp,pt同时存在,也没有影响到适配问题。谢谢您的解答,如果今后有其他疑问,再来咨询。 |
@FynnJason 正在测试,当使用副单位时可单独设置区别于主单位的设计图尺寸,也就是在一个项目中可以给主单位和副单位都分别设置一个不同的设计图尺寸,你上面的这个需求就可以完美解决,我上传 Github 你就可以测试下 |
你的需求我实现了,升级到 v1.1.0,使用方法看这 https://github.com/JessYanCoding/AndroidAutoSize/blob/master/demo-subunits/src/main/java/me/jessyan/autosize/demo/subunits/BaseApplication.java#L82 ,你给副单位单独设置个设计图尺寸即可 |
收到,谢谢。之前我在使用1.0.6版本时,manifest填写的是dp对应的值,xml中副单位使用的也是dp转化过来的值。如果现在更新到1.1.0,我需要在applicaiton中添加setDesignSize的px尺寸,原先使用过副单位的xml中的控件大小也要重新改成px大小的值,好像稍微有点麻烦 2333。 |
因为之前不支持这个功能,所以你副单位也使用 dp 来作为值,所以你现在使用 v1.1.0 新特性需要改回 px,但是对于后面有同样需求的使用者就会简便很多,只用 setDesignSize 即可让项目存在主单位和副单位,并且两种单位的设计图尺寸也可以不同 |
Environment
Bug Description:
注册清单已填写设计图的分辨率,在Application中初始化
按理说,使用副单位,默认是支持原项目的DP,但是启动APP后,整个项目无法兼容DP。我将Activity实现CancelAdapt 后,项目正常显示了。那么现在问题来了,既然默认是支持原项目DP,为什么还要手动将所有Activity去实现取消适配?现在我是在BaseActivity中实现的,如果项目迭代的新界面要都用副单位来适配,那我岂不是要重新创建一个单独的基类来继承吗?
Log:
Screenshot
Related Code:
Others:
The text was updated successfully, but these errors were encountered: