Open JessYanCoding opened 6 years ago
设计标注的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 也会乘以一个倍数,这个就不是原来的值了吧,是不是这样的?
@18243013969 是你说的这个情况,但取消适配这个功能是专门给使用 dp、sp 布局的时候使用的,如果使用副单位进行布局的话,根本不存在取消适配这一说,因为你如果某个页面不需要适配,那就在布局中不要使用副单位进行布局就可以了
假使你确实想使用 实现 CancelAdapt 的方式取消副单位的适配,并将你指出的逻辑也修改正确的话,取消适配过后的页面,因为布局中使用的是副单位,实际预览效果也会惨不忍睹,基本不能看,因为 in、mm、pt 这三个单位系统最后换算成 px,值都会非常大,假使布局中使用 2 in,也占小半个屏幕了,你布局中一来就 几十 in,直接超出了屏幕可以容纳的面积,所以如果某个页面使用副单位,并且想取消这个页面的适配,可行的办法就是将布局中的副单位都修改成 dp 或 sp
其实取消适配这个需求的由来就是因为,这个框架如果使用 dp、sp 的话,会影响三方库或者系统控件,因为他们里面也是使用 dp、sp 进行布局,如果使用副单位,取消适配这个需求基本上就不需要的,因为副单位就是为了彻底解决框架会影响三方库或系统控件的问题,但也增加了侵入性,所以框架也同时支持 dp、sp、副单位的使用,可以按自己的需求自行切换,CancelAdapt 这个功能也就保留了下来
不过还是感谢你的指出,这里你是在代码上的分析,是没有错的,我这里确实存在纰漏,既然指出了,我这里也修正了下 https://github.com/JessYanCoding/AndroidAutoSize/commit/e6c0370101be0a1b649872087b351fa30353b3de
当页面中有多级列表时,动态加载列表数据,子级列表会适配不好或不能适配,请问怎样解决?
横屏应用 ,在返回home键再进入应用的时候 有些尺寸会失控,但是进入别的页面再返回进来又正常。包括页面中RecyclerView的一些item也会失控。怎么解决
谢谢,解决了
设计图是按照iPhone6(750x1334),配置里面 <meta-data android:name="design_width_in_dp" android:value="360"/> <meta-data android:name="design_height_in_dp" android:value="640"/> 真机运行时只有预览图的高度的一半
@folinwu AndroidManifest 填写的 1334,布局中却是以 667 的最大高度来布局,当然只会有一半
这个是设计图要求的高度200dp(没做适配) ![Uploading image.png…]()
这个是AndroidManifest做了适配之后的(720x1280)
@folinwu 我觉得可能你没明白框架的用法,你在 QQ群 (301733278) 里找到我私聊
toast跟弹出的popwindow都很小了,在popwindow的布局设置了UI给的尺寸也不行
@Zrsod07 自己翻 issues
Unable to get provider me.jessyan.autosize.InitProvider: java.lang.ClassNotFoundException: Didn't find class "me.jessyan.autosize.InitProvider" 这是什么意思?4.4
@xianhe005 某些系统抽风,声明的类名省略了包名,报找不到?我现在声明全地址咯 https://github.com/JessYanCoding/AndroidAutoSize/commit/5a8bfa97039ec4568557a02ff25cd9169591d74d
这里提个建议,作者有时间富余可以考虑来一个kotlin版本,这样更全面一点
@skyCracks Demo 有可能出 Kotlin 的版本,框架没这个考虑
在同一个fragment 使用WebView和RecyclerView,RecyclerView的item布局使用副单位pt,在java代码里面先执行WebView的loadUrl,再去加载RecyclerView数据,item的pt单位适配会失效。
适配方案确实很好,但是接入Tinker后,整个框架就失效了,作者可以关注一下
如果您对 AndroidAutoSize 和 JessYan 有什么好的建议,都可以在下面留言以及讨论