AndroidAutoSize
AndroidAutoSize copied to clipboard
JessYan: 意见收集 😘,请进 QQ 群: 455850365
设计标注的px,我们要转换成dp,是吧
@q454216935 AndroidAutoSize 在版本 v0.9.1 之后,新增了副单位,区别与传统的今日头条方案,可以使用 pt、in、mm 这三种冷门单位在 layout 文件中布局,这样不光可以直接填写设计图中的 px 尺寸,不需要再将 px 转化为 dp 外,还可以规避修改 DisplayMetrics#density 所造成的对于其他使用 dp 布局的系统控件或三方库控件的不良影响
那我们在AndroidManifest里面是写转换过的dp尺寸还是px呢
@q454216935 AndroidManifest 直接填 px 尺寸,在布局中也写 px 的尺寸,但是单位用副单位,详情看 demo-subunits ,注释写的很详细
谢谢,pt的话布局预览的时候看不到全部的,请问你是怎么预览的。0.0
@q454216935 按照 README 中的步骤,创建对应单位的模拟设备,布局中用什么单位就创建什么单位的模拟设备,不可能预览不了,所有单位的模拟设备我测试了无数遍,全部将 Preview 放大到 1000%,测得创建的所有单位的模拟设备预览时与设计图的误差都不超过 0.5 px
设计标注为1080px * 1920px ,然后假设有一个高度为100px,宽度为200px,这个宽高的px怎么计算成dp呢
这个和Android MD控件兼容吗?之前用的弘扬的autolayout和MD控件不兼容,布局里单位写的px
哈哈开个脑洞,如果刘海屏,水滴屏能直接适配就牛逼了~感谢Jess神开发如此低成本的适配框架
@kevinStrange 直接用上面留言提到的副单位,直接可以按照设计图的尺寸填写
@yutouxiansheng 和控件没有关系,只要将框架引入项目,所有控件都可以适配
可以写dp吗?
你好,我用你的方法创建了副单位布局预览的设备,但是使用中发现一个问题,ui给的图标用wrap_content的话,会显示得非常小,很不方便。是不是用这个方法的话必须要硬编码图标的长和宽?
不是,这个只是预览设备显示效果会变小,图片运行到实际设备不一定会小,为了让副单位布局的页面预览效果能够和设计图的显示效果一模一样,所以使用算法求出的预览设备的屏幕尺寸都是被放大了很多倍的,wrap_content 在放大很多倍的屏幕上显示效果变小在所难免,但并不影响实际的运行效果,因为实际设备的屏幕尺寸是正常
@JessYanCoding 嗯,在小的设备上,的确没什么违和感。但是在一些大的设备上,比如平板之类的,图标用wrap_content,其他控件都按照这种适配方案同比例放大了,就这个图标还是原来的大小,就很违和了。
@Leu-Z wrap_content 是按图片的实际大小来显示,在小屏显示正常,在大屏显示效果就很小不是很正常吗,因为图片实际大小是没变的,你要想这个图片也能和其他控件一样同比例放大,就给它标注尺寸,使用 wrap_content 框架是不会帮你同比例缩放的
嗯,所以我觉得为了更好的适配,图片还是标注尺寸为好(虽然很麻烦,可能还会出现放大模糊的问题),不然在某些设备上太违和了。
模糊是因为你没有在对应 drawable-xxx 文件夹中放入对应分辨率的图片,你放的图片只适配了小屏幕手机,你却强制要让这个低分辨率的图片放大 N 倍,去适配平板,能不模糊吗,说到底是你自己图片分辨率就没给够,如果你让设计师给你多切几个不同分辨率的图片,来适应不同分辨率的屏幕,你直接用 wrap_content 也可以适配,这是你自己需要做的了
谢谢大神指教!
大神你好,我没看懂你那条公式,请问是怎么计算的呢,1920^2是什么意思呢
@kevinStrange ... 兄弟,数学该去补补了,这些都是数学符号,^2 是平方的意思,sqrt 是开根的意思
@fazhongxu 描述的不清晰,没听懂你表达的内容,最好图文并茂详细描述
你这样描述后我就清楚了,也就马上定位问题了,因为这个框架的自动运行机制是在每个 Activity 的 onCreate 时主动适配当前页面,但是你没打开 App,Activity 的 onCreate 就不会调用,所以如果在你不打开 App 的情况下,就需要在输入法弹出前主动调用 AutoSize#autoConvertDensityOfGlobal 手动触发屏幕适配,
@fazhongxu https://github.com/JessYanCoding/AndroidAutoSize/blob/master/autosize/src/main/java/me/jessyan/autosize/AutoSize.java 这个类不就是工具类吗,里面全是静态方法,你这个方法,在这个类里面也是有的,甚至还有很多可以扩展适配参数的方法,我上面的回答就让你手动调用这个 AutoSize#autoConvertDensityOfGlobal 方法,和你这个差不多,你没看吗,你重新叙述一遍我上面给你的解决方案,还建议我让我加一个在框架创建之初就有的类,让我很懵逼......
@fazhongxu 行,空了加上
@q454216935 AndroidManifest 直接填 px 尺寸,在布局中也写 px 的尺寸,但是单位用副单位,详情看 demo-subunits ,注释写的很详细
那为什么布局里不直接填写px,而要填写mm、pt或in?
@liyujiang-gzu 这个我不想回答了,是这个方案的基础,去看我之前写的今日头条方案的文章,里面都有介绍
大佬,副单位要如何设置,兼容适配之前代码写的dp?
@Jeffery336699 看 demo-subunits 副单位的所有用法在里面都有展示,并且有几倍于代码的超详细注释
switch (AutoSizeConfig.getInstance().getUnitsManager().getSupportSubunits()) { case NONE: break; case PT: displayMetrics.xdpi = xdpi * 72f; break; case IN: displayMetrics.xdpi = xdpi; break; case MM: displayMetrics.xdpi = xdpi * 25.4f; break; default: break; }
调用cancelAdapt的时候getSupportSubunits里面的值并如果不是IN的话,初始化的xdpi 也会乘以一个倍数,这个就不是原来的值了吧,是不是这样的?