Join GitHub today
GitHub is home to over 50 million developers working together to host and review code, manage projects, and build software together.
Sign up「Android 屏幕适配终结者」问题汇总 #758
Comments
|
AdaptScreenUtils提供适配宽度和高度2个方法,1080x1920尺寸,适配宽度1080,那View的高度是自动适配1920的高度吗? |
|
@Sum-sdl 适配是在某一维度上进行适配,另一维度一般是可滚动的,如果像你这么说两个纬度都固定了,那怎么可能做到适配,比如你宽度适配了,你又要适配高度,那不同宽高比的手机在某一维度肯定会存在变形的。 |
|
适配的话,需要把项目上的dp单位都改成pt吗? |
|
@jingzz1 不需要的啊,你从前的布局就别改动了,新的可以适配进来,老的你想改那也可以 |
|
感谢 BlankJ 老师的分享,AndroidAutoSize 已经迭代 10 多个版本,扩展了很多自定义功能,基本能满足所有人的屏幕适配需求,唯一美中不足的就是屏幕适配在某些情况下可能会失效的问题,这一直困扰着 AndroidAutoSize 以及今日头条屏幕适配方案,之前我对于此问题提供了两种解决思路 第一个就是在布局显示到屏幕上之前,调用框架提供的方法将 DisplayMetrics 的参数恢复成期望的值,但必须保证调用这个方法到布局显示到屏幕的期间,DisplayMetrics 的参数不能被修改,由于某些定制系统的行为可能是未知的,所以就一直没找到一个最合适并且通用的调用时机 第二个就是寻求获得唯一修改 DisplayMetrics 的权限,让其他代码不能修改 DisplayMetrics,但这也只是构想,还没找到比较好的解决方案 今天看到 blankJ 老师的文章,恍然大悟,我第一个方案一直在寻找的最合适的调用时机,可能就是您的方案! 今日头条方案的切入点 TypedValue.applyDimension(int unit, float value, DisplayMetrics metrics) 方法,需要传入一个 DisplayMetrics,而系统会在调用 TypedValue.applyDimension 之前通过 context.getResources() 获取 DisplayMetrics,所以重写 getResources 将 DisplayMetrics 的参数修改为正确的值,这样就可以极大的避免了 DisplayMetrics 的参数在布局显示到屏幕上之前被修改,我之前还是想太复杂,舍近求远,没有关注到这个这个核心切入点 不过这里还有一个疑虑,如果在调用 TypedValue.applyDimension 到布局显示到屏幕的期间,DisplayMetrics 的参数被其他未知代码修改,也还是会造成屏幕适配的失效,不过您的解决方案已经可以让稳定性提升一大步 最后感谢 BlankJ 老师的分享,文中的总结很到位,我们都是站在巨人的肩膀上,感谢开源,我们一起努力将会让今日头条屏幕适配方案更完美! |
|
pt!=dp 为什么说关闭这个效果pt的效果==dp 这点不是很明白 |
|
@45541926 所谓的关闭我还是对 pt 操作了,又不是原生的 1pt = 1/72 inch |
哦哦 懂了 ths |
|
果然强大呀,但有一事不解,如下代码:
不知为什么挑了 |
|
pt 比较接近于 dp,inch、mm 都太大了 |
|
@lcl6 你说的是什么意思?上个图吧,textview 内容无法对齐和我这适配有什么关系?是你自己设置的 gravity 不同啊 |
|
如果是悬浮窗适配,因为 inflate 用到的 context 是 application 级别的,所以需要在自定义的 Application 中重写 getResource。参考 #840 |
|
单个维度适配的话,那在一些全面屏手机上比如:1080*2280这个种情况下高度,控件的高度就变小了,有什么办法可以解决吗? |
|
单纬度是因为有一维度是可滚动的啊,怎么会变小呢,我 demo 有变小? |
|
您好,问一下,如果我要在pad上适配的话,会有什么问题么 |
|
@mufaith 和设备没关系的,只要是 android 就行 |
|
@nwhhades 是正常写在 getResource 里的吗? |
|
@Blankj 对的 |
|
不旋转屏幕的时候都是正常,触发onConfigurationChanged后个别item出现失效 |
|
@nwhhades @licheedev 旋转屏幕的话因为之后的 width 变成了 height,所以反一下即可。 @Override
public Resources getResources() {
if (ScreenUtils.isPortrait()) {
return AdaptScreenUtils.adaptWidth(super.getResources(), 1080);
} else {
return AdaptScreenUtils.adaptHeight(super.getResources(), 1080);
}
} |
|
@Blankj <?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle">
<corners android:radius="12pt" />
<padding
android:bottom="4pt"
android:left="8pt"
android:right="8pt"
android:top="4pt" />
<solid android:color="#44aaaaaa" />
</shape> |
|
它的 View getResource 是适配后的那就行呀,也就是你开启了适配,那就有效 |
它的 View getResource 是适配后的 是指该View的getResource方法做了适配的就可以是吗 如果这个getResource适配写在activity 那么只要是属于这个activity context下的所有view只要是pt单位的就会得到适配吗 适配后他的自定义属性 或者background引用的资源内使用的pt单位 或者是 所有为pt的单位的属性都会得到适配?(自定义view的自定义属性取值要怎么做 pt2px就行吗?) |
应该是的,你可以实测下哈 |
|
@Blankj ConverUtils中的dp2px,px2dp等使用的都是系统的DisplayMetrics,改成应用自己的是不是比较好,否则如果使用了修改density的适配方案,这里依然是按照旧的density进行转换的 |
|
@walkthehorizon 不推荐 dp 适配,会导致系统 View 大小出问题。 |
|
@wsyzj92 如果你字体不想随系统字体改变而改变,那字体大小用 pt 即可,如果想采用 sp 的话,那就用 |
|
@Blankj 好的,明白了。 |
|
字体采用pt不能随系统改变,采用sp那不就是等于说字体不适配吗?这个很重要吧 |
|
@rube520 谁规定应用字体就一定要用 sp 了,sp 只是能根据系统字体大小而改变罢了,有些应用就不想要这个随系统改变的功能,改变字体了 view 布局就出问题了,想用什么自己选择就好 |
|
重写application的getResources()方法会导致栈溢出。 |
|
感谢作者的开源库,关于屏幕适配我请教几个问题: |
|
@magic0908 资源都是用一套尽可能高的 dpi 的呀,适配是百分比适配,你传入了适配宽度是 375,那你写 375 pt ,那在任何机器上展示都是全屏的宽度,你写 100pt,那占的就是 100/375 的宽度百分比,你要布局要用其他适配,那你就别用 pt 就行了,你用 dp 那些对 pt 都不会有影响。 |
|
为什么我单位只有设置成pt才生效是否,其他的适配都不生效。设置是按照教程的1080*1920设置的 |
|
@qinlei00 好好看文章,文章里都说了是用 pt 适配,那你用其他单位肯定没啥用的 |
This comment has been hidden.
This comment has been hidden.
@nwhhades 解决了吗 |
|

Formed in 2009, the Archive Team (not to be confused with the archive.org Archive-It Team) is a rogue archivist collective dedicated to saving copies of rapidly dying or deleted websites for the sake of history and digital heritage. The group is 100% composed of volunteers and interested parties, and has expanded into a large amount of related projects for saving online and digital history.





文章地址
Android 屏幕适配终结者
发现 BUG 的话首先试试升级到最新版本看是否解决了哦。
MIUI 在 Android 5.1.1 情况适配失效
MIUI 自己封装了一层
Resource,需要去修改它内部的mTmpMetrics来适配,这个 BUG 应该是基于修改DisplayMetrics都会存在的,升级到 1.22.6 版本即可。