Skip to content
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 屏幕适配从未如斯简单 | Blankj's Blog #153

Open
Blankj opened this issue Aug 2, 2018 · 37 comments
Open

Android 屏幕适配从未如斯简单 | Blankj's Blog #153

Blankj opened this issue Aug 2, 2018 · 37 comments

Comments

@Blankj
Copy link
Owner

Blankj commented Aug 2, 2018

https://blankj.com/2018/07/30/easy-adapt-screen/

前言一个月前看了今日头条新的屏幕适配方案,这是传送门,对此不禁拍案叫绝,为此我想把这种方案融入到我工具类中直接一行代码即可适配,如今最新 1.18.0 版 AndroidUtilCode 已有其适配方案,其相关函数在 ScreenUtils 中,相关 API 如下所示:
123adaptScreen4VerticalSlide : 适配垂直滑动的屏幕adaptScreen4Horizontal

@L-X-J
Copy link

L-X-J commented Aug 10, 2018

#666666666666666666666666
##666666666666666666
###6666666
####666
#####6

@MirkoWu
Copy link

MirkoWu commented Aug 11, 2018

实际从“但是由于之前传入的是设计图 dp 尺寸“ 这之后就看不懂了,xml里写多少dp跟 drawable有什么关系啊。总感觉你有种走偏路的感觉,实际运行效果辣眼睛,建议跑跑真机。

@Blankj
Copy link
Owner Author

Blankj commented Aug 11, 2018

@MirkoWu
实际从“但是由于之前传入的是设计图 dp 尺寸“ 这之后就看不懂了,xml里写多少dp跟 drawable有什么关系啊。总感觉你有种走偏路的感觉,实际运行效果辣眼睛,建议跑跑真机。

之前的就是今日头条的做法,适配传入的是根据设计图的 dp 尺寸,而这设计图根据不同 dpi 就会有不同的 dp 尺寸,而我现在做的就是取了特例的 mdpi 来适配,dp 跟 drawable 是没啥关系,可是你同样 100dp 下的图片放在 mdpi 和 xxhdpi 在 xxhdpi 的手机下你说会有不同吗,所以要选择放尽可能高 dpi 的 drawable 下,实际运行是可以做到和设计图完美一致的,已经有小伙伴在项目上试过了,如果你显示的辣眼睛的话可能是你没有适配正确。

@MirkoWu
Copy link

MirkoWu commented Aug 11, 2018

@Blankj

@MirkoWu
实际从“但是由于之前传入的是设计图 dp 尺寸“ 这之后就看不懂了,xml里写多少dp跟 drawable有什么关系啊。总感觉你有种走偏路的感觉,实际运行效果辣眼睛,建议跑跑真机。

之前的就是今日头条的做法,适配传入的是根据设计图的 dp 尺寸,而这设计图根据不同 dpi 就会有不同的 dp 尺寸,而我现在做的就是取了特例的 mdpi 来适配,dp 跟 drawable 是没啥关系,可是你同样 100dp 下的图片放在 mdpi 和 xxhdpi 在 xxhdpi 的手机下你说会有不同吗,所以要选择放尽可能高 dpi 的 drawable 下,实际运行是可以做到和设计图完美一致的,已经有小伙伴在项目上试过了,如果你显示的辣眼睛的话可能是你没有适配正确。

我知道你的意思 依mdpi为例,设计图标的多少xml就写多少 ,实际就是1:1的意思,写dp和px效果是一样的。但这就相当于dp,sp失去了它们的意义,凡用到dp,sp的地方都可能发生适配的问题,比如说Toolbar,setTextSize()默认类型是sp,或者第三方库里面写死的一些dp,sp。目前想到这么多,界面我这再去调试下。

@Blankj
Copy link
Owner Author

Blankj commented Aug 11, 2018

@MirkoWu

@Blankj

@MirkoWu
实际从“但是由于之前传入的是设计图 dp 尺寸“ 这之后就看不懂了,xml里写多少dp跟 drawable有什么关系啊。总感觉你有种走偏路的感觉,实际运行效果辣眼睛,建议跑跑真机。

之前的就是今日头条的做法,适配传入的是根据设计图的 dp 尺寸,而这设计图根据不同 dpi 就会有不同的 dp 尺寸,而我现在做的就是取了特例的 mdpi 来适配,dp 跟 drawable 是没啥关系,可是你同样 100dp 下的图片放在 mdpi 和 xxhdpi 在 xxhdpi 的手机下你说会有不同吗,所以要选择放尽可能高 dpi 的 drawable 下,实际运行是可以做到和设计图完美一致的,已经有小伙伴在项目上试过了,如果你显示的辣眼睛的话可能是你没有适配正确。

我知道你的意思 依mdpi为例,设计图标的多少xml就写多少 ,实际就是1:1的意思,写dp和px效果是一样的。但这就相当于dp,sp失去了它们的意义,凡用到dp,sp的地方都可能发生适配的问题,比如说Toolbar,setTextSize()默认类型是sp,或者第三方库里面写死的一些dp,sp。目前想到这么多,界面我这再去调试下。

写 dp 和 px 效果不一样的啊,你如今写的 dp 是在所有手机上都会显示一致的 dp,而你写 px 就还是 px 那么回事,你再好好分析下原理吧。

@MirkoWu
Copy link

MirkoWu commented Aug 11, 2018

@Blankj

@MirkoWu

@Blankj

@MirkoWu
实际从“但是由于之前传入的是设计图 dp 尺寸“ 这之后就看不懂了,xml里写多少dp跟 drawable有什么关系啊。总感觉你有种走偏路的感觉,实际运行效果辣眼睛,建议跑跑真机。

之前的就是今日头条的做法,适配传入的是根据设计图的 dp 尺寸,而这设计图根据不同 dpi 就会有不同的 dp 尺寸,而我现在做的就是取了特例的 mdpi 来适配,dp 跟 drawable 是没啥关系,可是你同样 100dp 下的图片放在 mdpi 和 xxhdpi 在 xxhdpi 的手机下你说会有不同吗,所以要选择放尽可能高 dpi 的 drawable 下,实际运行是可以做到和设计图完美一致的,已经有小伙伴在项目上试过了,如果你显示的辣眼睛的话可能是你没有适配正确。

我知道你的意思 依mdpi为例,设计图标的多少xml就写多少 ,实际就是1:1的意思,写dp和px效果是一样的。但这就相当于dp,sp失去了它们的意义,凡用到dp,sp的地方都可能发生适配的问题,比如说Toolbar,setTextSize()默认类型是sp,或者第三方库里面写死的一些dp,sp。目前想到这么多,界面我这再去调试下。

写 dp 和 px 效果不一样的啊,你如今写的 dp 是在所有手机上都会显示一致的 dp,而你写 px 就还是 px 那么回事,你再好好分析下原理吧。

我是以设计稿下设备来讲的(px = dp * density,设计稿下设备适配后 density=1),其他的尺寸还没测。你试试Toolbar能不能适配,就我上面提到那几个问题。界面的话我再测测,有问题再提你。

@zhongjuncoder
Copy link

用1080px的话,这样以前的布局和第三方库的界面岂不是都不能用了

@MirkoWu
Copy link

MirkoWu commented Aug 11, 2018

@zhongjuncoder
用1080px的话,这样以前的布局和第三方库的界面岂不是都不能用了

现在这样改的话,确实不能用了,对布局改动太大,以前那种 入侵很小,关闭也能正常使用。

@Blankj
Copy link
Owner Author

Blankj commented Aug 11, 2018

@zhongjuncoder
用1080px的话,这样以前的布局和第三方库的界面岂不是都不能用了

那你以前布局是咋写的,你以前布局是按照什么写的那就传入多少 dp 尺寸就行,你以前 layout 是参照设计图 xxhdpi 那就把你 xxhdpi 设计图的 dp 宽度传入就行,以 mdpi 的话那就直接传入 mdpi 设计图的 dp 宽度,不建议你修改老的代码,你用老代码那就 cancelAdapt 不就好了么,我这有恢复的功能的。

@Blankj
Copy link
Owner Author

Blankj commented Aug 11, 2018

@MirkoWu

@zhongjuncoder
用1080px的话,这样以前的布局和第三方库的界面岂不是都不能用了

现在这样改的话,确实不能用了,对布局改动太大,以前那种 入侵很小,关闭也能正常使用。

以前就按照以前的就好了,我这适配了也可以取消适配的啊,文中都有说到的,建议采用 mdpi 是方便 Android Studio 预览和设计图做比较,也不用自己去换算 dp 和 px

@zhongjuncoder
Copy link

@Blankj

@MirkoWu

@zhongjuncoder
用1080px的话,这样以前的布局和第三方库的界面岂不是都不能用了

现在这样改的话,确实不能用了,对布局改动太大,以前那种 入侵很小,关闭也能正常使用。

以前就按照以前的就好了,我这适配了也可以取消适配的啊,文中都有说到的,建议采用 mdpi 是方便 Android Studio 预览和设计图做比较,也不用自己去换算 dp 和 p

@zhongjuncoder
Copy link

@Blankj

@MirkoWu

@zhongjuncoder
用1080px的话,这样以前的布局和第三方库的界面岂不是都不能用了

现在这样改的话,确实不能用了,对布局改动太大,以前那种 入侵很小,关闭也能正常使用。

以前就按照以前的就好了,我这适配了也可以取消适配的啊,文中都有说到的,建议采用 mdpi 是方便 Android Studio 预览和设计图做比较,也不用自己去换算 dp 和 px

你们的设计图不是按1080,360dp标的吗?设计图不是直接给dp还要转换的???

@Blankj
Copy link
Owner Author

Blankj commented Aug 11, 2018

@zhongjuncoder

@Blankj

@MirkoWu

@zhongjuncoder
用1080px的话,这样以前的布局和第三方库的界面岂不是都不能用了

现在这样改的话,确实不能用了,对布局改动太大,以前那种 入侵很小,关闭也能正常使用。

以前就按照以前的就好了,我这适配了也可以取消适配的啊,文中都有说到的,建议采用 mdpi 是方便 Android Studio 预览和设计图做比较,也不用自己去换算 dp 和 px

你们的设计图不是按1080,360dp标的吗?设计图不是直接给dp还要转换的???

并不是所有公司的设计师用的都是同一款设计软件,有些只有一套 px 方案,有些可能就是都会有,所以就直接 mdpi 去做最为方便了。

@MirkoWu
Copy link

MirkoWu commented Aug 11, 2018

@Blankj

@zhongjuncoder

@Blankj

@MirkoWu

@zhongjuncoder
用1080px的话,这样以前的布局和第三方库的界面岂不是都不能用了

现在这样改的话,确实不能用了,对布局改动太大,以前那种 入侵很小,关闭也能正常使用。

以前就按照以前的就好了,我这适配了也可以取消适配的啊,文中都有说到的,建议采用 mdpi 是方便 Android Studio 预览和设计图做比较,也不用自己去换算 dp 和 px

你们的设计图不是按1080,360dp标的吗?设计图不是直接给dp还要转换的???

并不是所有公司的设计师用的都是同一款设计软件,有些只有一套 px 方案,有些可能就是都会有,所以就直接 mdpi 去做最为方便了。

还是我们公司现在的方案好,直接给设计稿原件,配合软件,dp/px模式随意切换。

@wangankang
Copy link

,那样如果你曾经写的一个按钮宽度是 36dp,那么为了适配还需要改为 36 / 3 = 12dp,请问为什么要除以3呀,这里看不太懂了

@liuly0218
Copy link

支持一下支持一下

@cxmmxc
Copy link

cxmmxc commented Aug 13, 2018

我用头条的方案去适配普通页面都OK,但是我有一个layout里面是有ViewStub的,这个ViewStub的适配完全错乱,里面的ImageView图标变的很大;
楼主遇到过没,或者看一下?

@Blankj
Copy link
Owner Author

Blankj commented Aug 13, 2018

@cxmmxc
我用头条的方案去适配普通页面都OK,但是我有一个layout里面是有ViewStub的,这个ViewStub的适配完全错乱,里面的ImageView图标变的很大;
楼主遇到过没,或者看一下?

ImageView 你怕是尺寸用了 wrapContent ?是的话就写成固定尺寸试试

@Blankj
Copy link
Owner Author

Blankj commented Aug 13, 2018

@wangankang
,那样如果你曾经写的一个按钮宽度是 36dp,那么为了适配还需要改为 36 / 3 = 12dp,请问为什么要除以3呀,这里看不太懂了

如果你之前是以 mdpi 适配的,转换到 xxhdpi 就要除以 3 了哈,如果只给一套 px 设计图的话这样就很难受了哈,反正就是推荐使用 mdpi 来适配,而且方便在 Android Studio 预览。

@Blankj
Copy link
Owner Author

Blankj commented Aug 14, 2018

issue 地址

@guojiadui
Copy link

个人测试了一下,是目前最厉害的适配了,没有之一,拿着ui图,根据px多少就写多少dp,无脑写

@BingoHe
Copy link

BingoHe commented Aug 22, 2018

“这样我们新建一个宽为 1080px 的 mdpi 设备,然后切换为该设备来预览布局就完美解决了以上问题”
大佬,在AndroidStudio中创建虚拟机的时候,将宽度设为1080px,density直接变成了xxhdpi,而不是mdpi,预览的时候到底该怎么办呢???

@Cuiernao
Copy link

看完还是有点懵懂啊 。。。。

@Blankj
Copy link
Owner Author

Blankj commented Aug 26, 2018

@CuiErNaoAndLiuShanShan
看完还是有点懵懂啊 。。。。

亲自使用下试试比较下

@Cuiernao
Copy link

我原来放了三套图,h xh xxh,还需要把 h xh的图删掉啊?

@Blankj
Copy link
Owner Author

Blankj commented Aug 26, 2018

@CuiErNaoAndLiuShanShan
我原来放了三套图,h xh xxh,还需要把 h xh的图删掉啊?

你要是想留着那就留着,这样可以 h 的加载 h 的,xh 加载 xh 的,这随意你,你要是只想保留一套,那就保留最高清的就行

@zhaoxiuyu
Copy link

第二个值 是传1080 还是480。?

@Blankj
Copy link
Owner Author

Blankj commented Aug 31, 2018

@zhaoxiuyu
第二个值 是传1080 还是480。?

仔细看文章了吗 传的是 px 值

@heyzqt
Copy link

heyzqt commented Oct 11, 2018

你好,请问我在使用RecyclerView时,在今日头条的适配方案下,出现了RecyclerView的density复原这个问题,
参考掘金https://juejin.im/post/5b7fafb351882542af1c75ad 里你写的这个解决方案
RecyclerView直接不显示了,请问是什么原因?

@fmliqi
Copy link

fmliqi commented Oct 29, 2018

看了头条的方案,然后看到了你的这篇文章。我说一点我的理解,头条是将所有设备的宽/高固定360dp,也是目前主流的宽度。而你做法和它有些不同,你好像是改变了density的定义,本来它是代表设备的1dp有包含的px,你这里转换过后表示的是设计图1px代表多少设备px,不同的设备就有不同的px值了, 这里设计图的px相当于原来的dp了。这样的理解不知道是不是对上了你的意图?

@rj11304
Copy link

rj11304 commented Apr 29, 2019

我在githus上看到的源码怎么不一样,根本没做适配。怎么回事?

@HUI132111
Copy link

楼主,这个有依赖导入吗

@Blankj
Copy link
Owner Author

Blankj commented Jun 27, 2019

楼主,这个有依赖导入吗

用这个 https://blankj.com/2018/12/18/android-adapt-screen-killer/

@HUI132111
Copy link

好的,谢谢楼主

@turingking
Copy link

遇到了一个问题,如果页面有异常崩溃掉了,所有的适配都会变形。这个时候如何恢复适配。
因为大部分的崩溃都是关闭当前activity,回到上一个activity。此时应用没有完全退出,但是适配失效了,用户体验很不好

@Blankj
Copy link
Owner Author

Blankj commented Aug 7, 2019

@turingking
遇到了一个问题,如果页面有异常崩溃掉了,所有的适配都会变形。这个时候如何恢复适配。
因为大部分的崩溃都是关闭当前activity,回到上一个activity。此时应用没有完全退出,但是适配失效了,用户体验很不好

参考这个方案,在getResource 里恢复 或者直接用这个方案 https://blankj.com/2018/12/18/android-adapt-screen-killer/

@turingking
Copy link

turingking commented Aug 8, 2019 via email

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

No branches or pull requests