GithubHelp home page GithubHelp logo

wildma / screenadaptation Goto Github PK

View Code? Open in Web Editor NEW
1.5K 36.0 544.0 634 KB

:fire:一种非常好用的 Android 屏幕适配——smallestWidth 限定符适配 https://www.jianshu.com/p/1302ad5a4b04

Java 100.00%
screenadaptation screen adaptation adapterview

screenadaptation's Introduction

一种非常好用的 Android 屏幕适配——smallestWidth 限定符适配

使用

  1. 获取设计图最小宽度(单位为 dp)。
  2. 以设计图最小宽度作为基准值,生成所有设备对应的 dimens.xml 文件。
    如果项目只需要适配手机的话,只需要生成 320、360、362.2641、384、392.7272、400、410、411.4285、432、480 对应的 dimens.xml 文件即可。
  3. 根据设计图标注,标注多少 dp,布局中就写多少 dp,格式为 @dimen/dp_XX。

详细介绍请看文章:一种非常好用的 Android 屏幕适配

优点

  • 使用简单
    利用插件生成对应的 dimens.xml 文件,设计图标注多少 dp,布局中就写多少 dp,格式为 @dimen/dp_XX,sp 同理。

  • 稳定性好
    smallestWidth 限定符适配方案很早就出现了,经过大量用户的验证,市面上的主流设备几乎都能精准适配。

  • 对性能无影响
    适配原理是系统根据限定符去寻找对应的 dimens.xml 文件,并不影响程序的性能。

  • 兼容性好
    smallestWidth 限定符适配寻找 dimens.xml 文件的原理是从大往小找,没有对应的则使用默认的,所以即使没有完全匹配也能达到不错的适配效果。

  • 不影响第三方库
    需要适配的地方使用该种适配方案即可,不会影响到第三方库。

  • 更换成本低
    该套适配方案采用的单位是 dp 和 sp,dp 和 sp 是 google 推荐使用的计量单位,即使以后不用该套适配方案,任然不影响现有的界面。

适配效果图

如下,将按钮的宽度设置为 @dimen/dp_360,运行在不同(最小宽度不同)的设备上都是可以铺满屏幕宽度的,说明适配成功!

Nexus S(320 dp):

Nexus S

Nexus 5(360 dp):

Nexus 5

Nexus 4(384 dp):

Nexus 4

Pixel 3(392.7272 dp):

Pixel 3

Pixel XL(411.4285 dp):

Pixel XL

Pixel 3 XL(411.4285 dp):

Pixel 3 XL

ps:如果对你有帮助,点下 star 就是对我最大的认可。

screenadaptation's People

Contributors

wildma avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

screenadaptation's Issues

xml 字体适配没问题,动态设置适配不了

/获取sp值/
float pxValue = getResources().getDimension(R.dimen.sp_15);//获取对应资源文件下的sp值
int spValue = ConvertUtils.px2sp(this, pxValue);//将px值转换成sp值
mTvShowParams.setTextSize(spValue);//设置文字大小

    /*获取dp值*/
    float pxValue2 = getResources().getDimension(R.dimen.dp_360);//获取对应资源文件下的dp值
    int dpValue = ConvertUtils.px2dp(this, pxValue2);//将px值转换成dp值

按照这个动态适配,字体显得很大,大神碰到过吗

适配的小问题??

UI在720x1280上做的图,其中一个按钮的宽高分辨为:宽720px,高为100px,字体大小为30px,
因为基准是在480*320
手机不论是720x1280还是1080x1920的上面

假如要是在UI在1080x1920上做的图 宽720px,高为100px,字体大小为30px
手机不论是720x1280还是1080x1920的上面

跟手机的分辨率没有关系,手机会去不同的文件夹去寻找吗,是这个意思吗

横屏怎么适配?

应用如果是竖屏的情况下没问题,但如果屏幕旋转成横屏(如平板),则底部的按钮还是显示的是竖屏时的宽度.

适配最小宽度的问题

屏幕最小宽度的,设计图的基准的屏幕最小宽度是怎么计算的,demo中为什么是360,
假如UI用的基准尺寸是750*1334,那么我的smallestWidth是多少,也是360吗,还是每个手机都不一样,那我应该用smallestWidth的作为基准

作者有没有考虑做成一个远程依赖

如题,这样做的好处有两个:

  1. 不用在项目中看到这些通配符适配的代码,降低项目的复杂度
  2. 更新迭代的成本比较低,只需修改远程依赖的版本即可

新的最小宽度尺寸 :451.7647

HUAWEI NOH-AL00 Android 10

屏幕宽 -----> widthPixels =1152
屏幕高 -----> heightPixels =2376
屏幕density -----> density =2.55
屏幕widthDP -----> widthDP =451.7647
屏幕heightDP -----> heightDP =931.7647
屏幕smallestWidthDP -----> smallestWidthDP =451.7647

您好,首先感谢您的开源,你的库对我们这些开发者帮助非常的大,不过我有些不太理解的地方,想请教下dp转px的问题,这个问题不是您的库的问题

出于我的技术水平问题,在看到您的文章后感觉您对适配方面的知识挺好的,就来问下dp转px的问题

比如说我在如下信息的屏幕上:
屏幕的宽度(单位:px): 1200
屏幕的高度(单位:px): 1600
屏幕密度(单位:DPI): 160
屏幕密度density(DPI / (160像素/英寸)): 1.0
base_dp(width/density): 1200.0
此时1dp=1px
我通过代码动态设置时用下面这个方法没什么问题:1200dp可以刚好充满屏幕
/**
* dp值转换成px值
*
* @param dpValue dp值
* @return px值
*/
public static int dp2px(Context context, final float dpValue) {
final float density= context.getResources().getDisplayMetrics().density;
return (int) (dpValue * density+ 0.5f);
}
//---------------------------------------------------------------------------------------------------------
换设备
屏幕的宽度(单位:px): 1080
屏幕的高度(单位:px): 1920
屏幕密度(单位:DPI): 420
屏幕密度density(DPI / (160像素/英寸)): 2.625
base_dp(width/density): 411.42856

我通过代码动态设置时(用上面dp2px方法)此设备下的
1200dp=3150.5px 远远超出了这个屏幕1080的宽,此时其他的dp也不适用了,通过代码适配就显得有问题了

请问在通过代码动态设置进行适配时
1.这个dp转px 是否和base_dp有关?
2.还是和屏幕宽度比有关?

我现在用的是2,dp转px改成了:
(dpValue * density+ 0.5f)*当前设备宽/base_dp屏幕宽度;

请问我这么做合理吗?

请问下,我这种情况是怎样填写base_dp

新起一个平板项目,屏幕分辨率是1366x768,屏幕尺寸是10.6寸,dpi未知,density未知,手头暂无此设备平板A。
但手上有一台屏幕分辨率1920x1080,屏幕尺寸是21.5寸,dpi是160,density是1.0,smallestWidthDp是1080dp的平板B,请问下我怎样填写base_dp=768还是1080,在这个手头上设备平板B,重新生成生成相应的dimens文件,来适配屏幕分辨率是1366x768,屏幕尺寸是10.6寸这台设备?
附问下,平板怎样做适配,我看了文章,不太明白。应该怎样填写base_dp,这个base_dp怎样确定,UI只给一个px的设计图,比如1366x768或者1920x1080,其它信息不知。我看到base_dp跟设备的smallestWidthDp、dpi、density有关的?

求教华为p9关于导航栏的适配方案

华为P9是手动控制导航栏是否显示的。当导航栏隐藏的时候,适配方案是1080x1920的。在进入应用后,显示导航栏,再进入另一个界面,却又适配的另外的方案,导致界面差距太大。这样的情况如何解决呢?大佬

高度适配

你好,这个是以720X1280的宽度基准来适配, 我测试好像高度好像不能完全适配。比如说720X1280的屏幕像华为的有些机子真实的屏幕高度并不是这个有虚拟导航栏,我设置高度为640dp 并不能兼容,能告知下这个是不兼容 还是智能用ScrollView 嵌套超出

请教多种设备适配问题

大佬您好,我的蓝湖设计图是1336x768dp
在大屏的pos机上还有平板,以及手机上都要适配,是横屏的项目
我如何填写base_dp呀

华为某些版本的Rom、

实测有几款华为的是这样,所以适配不到,不知道作者有没有相关发现。
同理,这套dp适配方案一定能按swwidth索引到相关资源吗?

不同横屏设备的适配

公司有两个设备,一台华为平板和一台RK3288的设备,分辨率分别为19201200、1366768。
具体参数如下图:
1,华为平板:
TIM截图20191210174708
2,RK3288主板:
TIM截图20191210174236

要如何才能同时适配两个不同分辨率的设备吗?

目前UI的给的设计图是按照19201200来设计的
1,通过PxCook来查看dp标注,使用xxhdpi下的标注,在华为平板(1920
1200)是能正常的显示。但是在RK3288主板(1366*768)上就显示不完全,宽高的比例都不对。如下图所示:
TIM截图20191210183546
TIM截图20191210183637
2,在screenMatch.properties中已经设置base_dp=600,match_dp=600,768
请问,还需要如何配置才能让Rk3288的主板才能适配适配起来吗?

其他尺寸适配

看了你的博客 和 别人的问题
#7 (comment)
是不是 只要 修改 screenMatch.properties 文件 base_dp=375 (或者是其他效果图上 的 宽度)
然后把你项目里 默认values/dimens.xml copy到我的工程 然后 用插件 生成就行了?

我建了一个的demo 是这样操作的 我运行了几个虚拟机 大都试了一下 没问题

不知道我的操作 步骤 有没有问题 望大佬指点一下

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.