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

「Android 屏幕适配终结者」问题汇总 #758

Open
Blankj opened this Issue Dec 17, 2018 · 11 comments

Comments

6 participants
@Blankj
Copy link
Owner

Blankj commented Dec 17, 2018

文章地址

Android 屏幕适配终结者

发现 BUG 的话首先试试升级到最新版本看是否解决了哦。

MIUI 在 Android 5.1.1 情况适配失效

MIUI 自己封装了一层 Resource,需要去修改它内部的 mTmpMetrics 来适配,这个 BUG 应该是基于修改 DisplayMetrics 都会存在的,升级到 1.22.6 版本即可。

@Blankj Blankj changed the title Android 屏幕适配终结者 issue 「Android 屏幕适配终结者」问题汇总 Dec 17, 2018

@Blankj Blankj added the enhancement label Dec 17, 2018

@Sum-sdl

This comment has been minimized.

Copy link

Sum-sdl commented Dec 18, 2018

AdaptScreenUtils提供适配宽度和高度2个方法,1080x1920尺寸,适配宽度1080,那View的高度是自动适配1920的高度吗?

@Blankj

This comment has been minimized.

Copy link
Owner

Blankj commented Dec 18, 2018

@Sum-sdl 适配是在某一维度上进行适配,另一维度一般是可滚动的,如果像你这么说两个纬度都固定了,那怎么可能做到适配,比如你宽度适配了,你又要适配高度,那不同宽高比的手机在某一维度肯定会存在变形的。

@jingzz1

This comment has been minimized.

Copy link

jingzz1 commented Dec 18, 2018

适配的话,需要把项目上的dp单位都改成pt吗?

@Blankj

This comment has been minimized.

Copy link
Owner

Blankj commented Dec 18, 2018

@jingzz1 不需要的啊,你从前的布局就别改动了,新的可以适配进来,老的你想改那也可以

@JessYanCoding

This comment has been minimized.

Copy link

JessYanCoding commented Dec 18, 2018

感谢 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 老师的分享,文中的总结很到位,我们都是站在巨人的肩膀上,感谢开源,我们一起努力将会让今日头条屏幕适配方案更完美!

@45541926

This comment has been minimized.

Copy link

45541926 commented Dec 20, 2018

pt!=dp 为什么说关闭这个效果pt的效果==dp 这点不是很明白

@Blankj

This comment has been minimized.

Copy link
Owner

Blankj commented Dec 20, 2018

@45541926 所谓的关闭我还是对 pt 操作了,又不是原生的 1pt = 1/72 inch

@45541926

This comment has been minimized.

Copy link

45541926 commented Dec 20, 2018

@45541926 所谓的关闭我还是对 pt 操作了,又不是原生的 1pt = 1/72 inch

哦哦 懂了 ths

@hurshi

This comment has been minimized.

Copy link

hurshi commented Dec 20, 2018

果然强大呀,但有一事不解,如下代码:

     public static float applyDimension(int unit, float value, DisplayMetrics metrics) {
        switch (unit) {
            case COMPLEX_UNIT_PX:
                return value;
            case COMPLEX_UNIT_DIP:
                return value * metrics.density;
            case COMPLEX_UNIT_SP:
                return value * metrics.scaledDensity;
            case COMPLEX_UNIT_PT:
                return value * metrics.xdpi * (1.0f / 72);
            case COMPLEX_UNIT_IN:
                return value * metrics.xdpi;
            case COMPLEX_UNIT_MM:
                return value * metrics.xdpi * (1.0f / 25.4f);
        }
        return 0;
    }

不知为什么挑了 PT 呢,用 IN 不是还省的 *72了?

@Blankj

This comment has been minimized.

Copy link
Owner

Blankj commented Dec 20, 2018

pt 比较接近于 dp,inch、mm 都太大了

@Blankj

This comment has been minimized.

Copy link
Owner

Blankj commented Dec 21, 2018

@lcl6 你说的是什么意思?上个图吧,textview 内容无法对齐和我这适配有什么关系?是你自己设置的 gravity 不同啊

@Blankj Blankj self-assigned this Dec 25, 2018

@Blankj Blankj pinned this issue Dec 25, 2018

@Blankj Blankj unpinned this issue Dec 25, 2018

@Blankj Blankj pinned this issue Dec 25, 2018

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment