精华内容
下载资源
问答
  • iOS屏幕适配几种方式

    万次阅读 2016-07-23 23:48:43
    在iOS开发中,会经常碰到屏幕适配的问题,下面来说一下自己在项目开发中遇到的几种屏幕适配方式. 第一种: 利用宽高比,在不同的屏幕中来进行对控件的位置与控件的宽高进行等比例缩放.选定一个型号的屏幕的宽高为...

    在iOS开发中,会经常碰到屏幕适配的问题,下面来说一下自己在项目开发中遇到的几种屏幕适配的方式.

    第一种:

    利用宽高比,在不同的屏幕中来进行对控件的位置与控件的宽高进行等比例缩放.选定一个型号的屏幕的宽高为基准,进行等比例缩放.例如以iPhone6或者iPhone6s为基准.

    其宽高分别是375与667.Iphone6ScaleWidth =  [UIScreen mainScreen].bounds.size.width/375; Iphone6ScaleHeight = [UIScreen mainScreen].bounds.size.height/667;

    如果是iPhone6或者iPhone6s则Iphone6ScaleWidthIphone6ScaleHeight的值都为1.但是此方法对于iPhone5之后的型号可以适用.因为我们知道iPhone4或者iPhone4s尺寸是320x480.iPhone5是320x568.所以对于4或者4s来说计算得到的宽高比不相同.可能会造成一个方形控件,在iPhone5之后的机型上显示的都是正方形.但是在4或者4s上显示的是长方形.需要进行自己的判断(目前来说4或者4s市场上已经不多见了).

    同时也可以在代理增加两个属性,宽高比例属性,例如:

    @interface AppDelegate : UIResponder <UIApplicationDelegate>
    @property float autoSizeScaleX;
    @property float autoSizeScaleY;


    在- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
        if(CurrentScreenHeight > 480){
            nowAppDelegate().autoSizeScaleX = CurrentScreenWidth/320.0;
            nowAppDelegate().autoSizeScaleY = CurrentScreenHeight/568.0;
        }else{
            nowAppDelegate().autoSizeScaleX = 1.0;其中nowAppDelegate() = (AppDelegate *)[[UIApplication sharedApplication] delegate];
            nowAppDelegate().autoSizeScaleY = 1.0;
        }

    }

    在项目对于控件的位置和尺寸乘以这两个缩放比例.

    第二种:

    使用autoLayout进行屏幕适配.代码如下:

        UIView *headView = [[UIView alloc] init];
        headView.translatesAutoresizingMaskIntoConstraints = NO;
        [self.view addSubview:headView];
        headView.backgroundColor = [UIColor redColor];
        NSLayoutConstraint *headViewLeft = [NSLayoutConstraint constraintWithItem:headView attribute:NSLayoutAttributeLeft relatedBy:NSLayoutRelationEqual toItem:self.view attribute:NSLayoutAttributeLeft multiplier:1.0 constant:0];
        NSLayoutConstraint *headViewTop = [NSLayoutConstraint constraintWithItem:headView attribute:NSLayoutAttributeTop relatedBy:NSLayoutRelationEqual toItem:self.view attribute:NSLayoutAttributeTop multiplier:1.0 constant:0];
        NSLayoutConstraint *headViewRight = [NSLayoutConstraint constraintWithItem:headView attribute:NSLayoutAttributeRight relatedBy:NSLayoutRelationEqual toItem:self.view attribute:NSLayoutAttributeRight multiplier:1.0 constant:0];
        NSLayoutConstraint *headViewHeight = [NSLayoutConstraint constraintWithItem:headView attribute:NSLayoutAttributeHeight relatedBy:NSLayoutRelationEqual toItem:nil attribute:0 multiplier:0 constant:200];
        self.headHeightCons = headViewHeight;
        [self.view addConstraints:@[headViewTop,headViewLeft,headViewRight]];
        [headView addConstraint:headViewHeight];
        
    
        UIImage *imageLol = [UIImage imageNamed:@"lol"];
        UIImageView *imageViewLol = [[UIImageView alloc] initWithImage:imageLol];
        [headView addSubview:imageViewLol];
        imageViewLol.translatesAutoresizingMaskIntoConstraints = NO;
        [imageViewLol setContentMode:UIViewContentModeScaleAspectFill];
    
        
        NSLayoutConstraint *imageLolViewLeft = [NSLayoutConstraint constraintWithItem:imageViewLol attribute:NSLayoutAttributeLeft relatedBy:NSLayoutRelationEqual toItem:headView attribute:NSLayoutAttributeLeft multiplier:1.0 constant:0];
        NSLayoutConstraint *imageViewLolViewTop = [NSLayoutConstraint constraintWithItem:imageViewLol attribute:NSLayoutAttributeTop relatedBy:NSLayoutRelationEqual toItem:headView attribute:NSLayoutAttributeTop multiplier:1.0 constant:0];
        NSLayoutConstraint *imageViewLolViewRight = [NSLayoutConstraint constraintWithItem:imageViewLol attribute:NSLayoutAttributeRight relatedBy:NSLayoutRelationEqual toItem:headView attribute:NSLayoutAttributeRight multiplier:1.0 constant:0];
        NSLayoutConstraint *imageViewLolViewBottom = [NSLayoutConstraint constraintWithItem:imageViewLol attribute:NSLayoutAttributeBottom relatedBy:NSLayoutRelationEqual toItem:headView attribute:NSLayoutAttributeBottom multiplier:1.0 constant:0];
        [headView addConstraints:@[imageLolViewLeft,imageViewLolViewTop,imageViewLolViewRight,imageViewLolViewBottom]];

    第三种:使用框架Masonry进行屏幕适配.读者可以自己找到框架或者demo看下,在这里就不多说了.

    展开全文
  • 屏幕适配几种方式

    千次阅读 2019-09-06 17:13:21
    衍生出许许多多手机厂商,各厂商生产的手机百十机型不算多吧,往往国人有一习惯,就是喜欢和别人的不一样,遵循:“别人无,我有;别人有,我好;别人好,我优”的心态。 往往不按照规范走,随意修改API,这都...

    Andorid是开源的,开源的好处是“百家争鸣,百花齐放”,更快的打入并占有市场,弊端呢?衍生出许许多多手机厂商,各厂商生产的手机百十种机型不算多吧,往往国人有一种习惯,就是喜欢和别人的不一样,遵循:“别人无,我有;别人有,我好;别人好,我优”的心态。

    往往不按照规范走,随意修改API,这都是常态;想做自己独特的东西,API任意修改,做我自己的定制,产品独特……往往只管赚钱,钱是首要的,记不清是谁说过的话,“先生产,后环保”;几十年过去了,国家、国人为了环保付出了多少努力?难道还不能反思一下自己吗?代价还不够沉重吗?

    言归正传,我等千千万猴子的现状是什么?做一个功能,这个机型很好,换一种机型就成了狗屎……屏幕适配千千万,到底什么才是最好的呢?答案是:没有最好的,只有最适合自己的;遇到问题不要想着如何回避,避免的实现思路短期可以,但是往往再次碰到的时候要怎么做?也许到了不得不来面对、不得不做的时候后悔莫及吗?什么事情都心理安慰自己,以后有时间再回过头来做吧,我一定记住,随着时间积累,需要做的事情越积累越多,压得自己透不过气来,到那时候已经为时已晚了;

    进入正题:什么是屏幕适配?

    讲解屏幕适配之前先要了解什么是dp、sp、px的概念;

    dp(dip): device independent pixels(设备独立像素). 不同设备有不同的显示效果,这个和设备硬件有关,一般我们为了支持WVGA、HVGA和QVGA

    如果设置表示长度、高度等属性时可以使用dp  或sp。但如果设置字体,需要使用sp。

    dp是与密度无关,sp除了与密度无关外,还与scale无关。如果屏幕密度为160,这时dp和sp和px是一 样的。1dp=1sp=1px,但如果使用px作单位,如果屏幕大小不变(假设还是3.2寸),而屏幕密度变成了320。那么原来TextView的宽度设成160px,在密度为320的3.2寸屏幕里看要比在密度为160的3.2寸屏幕上看短了一半。但如果设置成160dp或160sp的话。系统会自动将width属性值设置成320px的。也就是160 * 320 / 160。其中320 /160可称为密度比例因子。也就是说,如果使用dp和sp,系统会根据屏幕密度的变化自动进行转换。

    px: pixels(像素).  不同设备显示效果相同,一般我们HVGA代表320x480像素,这个用的比较多。 

    pt: point,是一个标准的长度单位,1pt=1/72英寸,用于印刷业,非常简单易用;

    sp: scaled pixels(放大像素).  主要用于字体显示best for textsize。

    当然了,dip虽然可以在某种程度上帮助我们去更好的适应不同密度的屏幕,但他也并不是万能的;

    一个尺寸标注为N dp的物体,它在不同屏幕上的实际物理尺寸(单位inch)为多少呢?

    计算公式如下:

    physical_size=N*(dpi/160)*(1/dpi)=N/160

    dpi代表了这个屏幕的密度,我们得到一个结论:

    用dp标注的物品,他在不同屏幕上的实际物理尺寸理论上将保持不变;

    只有dp就足够了吗?NO,NO,NO,

    布局适配

    布局要如何适配呢?大概可以通过以下几种思路来实现

    应杜绝使用绝对布局,使用绝对布局硬编的后果是,这一款或几款手机差不多可以,换其他手机来测试,会发现,这是我写的吗?什么鬼?Google提供的相对布局不可说不好,支持拖拽,画界面快,开发效率高,一脱成名,但是后期修改,维护成本有点高,原因不再累赘,所以这里也不再做相关介绍;

    1.初期参考使用权重来动态比例展示,LinearLayout的weight属性来进行权重设置,进而达到按比例显示布局的意图:

    不再相互规定,让各个view自己去做处理,在不同的屏幕上相互间距都是一样的(最起码看上去,哈),

    需要注意一点:weight是float类型

    2.view背景(button、textview等)尽可能少使用图片来做操作,多实用shape和seleter控制,效率高,错误率低,好控制;

    3.分块控制,杜绝所有的东西一笼统的在一个布局文件里面,找的困难,错误率大大提升,所以建议使用标签来控制<include>、<merge>、<viewstub>???,了解一下

    图片资源适配

    往往项目里面需要使用大量图片,来显得华丽一点,给人眼前一亮的感觉,资源图片Google也做了适配,不同的分辨率会先去加载最适应自己分辨率的资源,如果没有就去找最邻近的资源图片,直到找到为止;所以一些需要做适配的图片资源应该让UI出5套(hdpi、mdpi、xhdpi、xxhdpi、xxxhdpi),一些icon看情况来做适配,影响甚微;

     

    展开全文
  • android 屏幕适配几种方式

    千次阅读 2019-03-07 11:57:19
    简单介绍屏幕适配(三常用方案)- 1、像素(px): 含义:通常所说的像素,就是CCD/CMOS上光电感应元件的数量,一个感光元件经过感光,光电信号转换,A/D转换等步骤以后,在输出的照片上就形成一个点,我们如果...

                                                                   简单介绍屏幕适配(三种常用方案)-

    1、像素(px):

    • 含义:通常所说的像素,就是CCD/CMOS上光电感应元件的数量,一个感光元件经过感光,光电信号转换,A/D转换等步骤以后,在输出的照片上就形成一个点,我们如果把影像放大数倍,会发现这些连续色调其实是由许多色彩相近的小方点所组成,这些小方点就是构成影像的最小单位“像素”(Pixel)。简而言之,像素就是手机屏幕的最小构成单元

    • 单位:px(pixel),1px = 1像素点 一般情况下UI设计师的设计图会以px作为统一的计量单位。

    2、分辨率:

    • 含义:手机在横向、纵向上的像素点数总和 一般描述成 宽*高 ,即横向像素点个数 * 纵向像素点个数(如1080 x 1920)。

    • 单位:px(pixel),1px = 1像素点

    3、屏幕尺寸(in):

    • 含义:手机对角线的物理尺寸

    • 单位 英寸(inch),一英寸大约2.54cm 常见的尺寸有4.7寸、5寸、5.5寸、6寸

    4、屏幕像素密度(dpi):

    • 含义:每英寸的像素点数。 例如每英寸内有160个像素点,则其像素密度为160dpi。

    • 单位:dpi(dots per inch)

    • 计算公式: 像素密度 = 像素 / 尺寸 (dpi = px / in)

    • 标准屏幕像素密度(mdpi): 每英寸长度上还有160个像素点(160dpi),即称为标准屏幕像素密度(mdpi)

    • 密度类型     代表的分辨率(px)     屏幕密度(dpi)     换算(px/dp)     比例      图片px
      低密度(ldpi)     240x320                        120                   1dp=0.75px        3          36*36
      中密度(mdpi)     320x480                      160                  1dp=1px             4           48*48
      高密度(hdpi)     480x800                       240                     1dp=1.5px       6            72*72
      超高密度(xhdpi)     720x1280                320                     1dp=2px         8            96*96
      超超高密度(xxhdpi)     1080x1920        480                       1dp=3px       12           144*144

    一.Autolayout 用法 鸿洋地址 https://blog.csdn.net/qq_37237245/article/details/78134010

    1、将autolayout引入

    dependencies {
        compile project(':autolayout')
    }

     

    也可以直接

    dependencies {
        compile 'com.zhy:autolayout:1.4.5'
    }

      

    2、标明设计稿尺寸

    在AndroidManifest

    <meta-data android:name="design_width" android:value="768">
    </meta-data>
    <meta-data android:name="design_height" android:value="1280">
    </meta-data>

    3、使用时候有两种用法:

    一种是让你的Activity继承自AutoLayoutActivity.一般可以把你的基类继承AutoLayoutActivity

    如果你觉得这种对你的activity改变太大等等,,,

    那么,你可以将你的布局替换成

    LinearLayout -> AutoLinearLayout
    RelativeLayout -> AutoRelativeLayout
    FrameLayout -> AutoFrameLayout

     

    系统原有的属性都会保留。

    ps:几个注意事项

    1、可以多用margin,减少嵌套,因为不需要考虑适配问题,所以,可以直接margin固定距离尺寸等等,

    LinearLayout的weight也不需要,直接每个布局设置相同宽度即可。

    2、textview使用中发现很多问题,直接用px会出现高度不对问题。鸿洋这样解释:设计稿一般只会标识一个字体的大小

    ,比如你设置textSize=”20px”,实际上TextView所占据的高度肯定大于20px,字的上下都会有一定的间隙,所以一定要

    灵活去写字体的高度,比如对于text上下的margin可以选择尽可能小一点。或者选择别的约束条件去定位(比如上例,选

    择了marginBottom)

    但是更简单的处理方式是,我们的字体尺寸可以继续用sp.

    3、在listview ,recycleview 或者一些布局我们无法转换为autoXXX的布局,我们想为子布局做适配的时候,我们需要

    用到同一个方法, AutoUtils.autoSize(convertView);我们可以实例化出来子布局,然后设置适配,那么这个子布局将
    会适配auto布局。

    对于ListView
    对于ListView这类控件的item,默认根局部写“px”进行适配是无效的,因为外层非AutoXXXLayout,而是ListView。但

    是,不用怕,一行代码就可以支持了:

    @Override
    public View getView(int position, View convertView, ViewGroup parent){
        ViewHolder holder = null;
        if (convertView == null){
            holder = new ViewHolder();
            convertView = LayoutInflater.from(mContext).inflate(R.layout.list_item, parent, false);
            convertView.setTag(holder);
            //对于listview,注意添加这一行,即可在item上使用高度
            AutoUtils.autoSize(convertView);
        } else{
            holder = (ViewHolder) convertView.getTag();
        }
    
        return convertView;
    }

     

    注意AutoUtils.autoSize(convertView);这行代码的位置即可。demo中也有相关实例。

    对于RecyclerView

    public ViewHolder(View itemView){
          super(itemView);
          AutoUtils.autoSize(itemView);
    }
    
    //...
    @Override
    public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType){
         View convertView = LayoutInflater.from(mContext).inflate(R.layout.recyclerview_item, parent, false);
         return new ViewHolder(convertView);
    }

     

    一定要记得LayoutInflater.from(mContext).inflate使用三个参数的方法!

    当然大家现在也没谁用这种low炸了,直接写adapter了吧,太麻烦了,BaseQucickAdapter是一个高达14k的强大的adapter,

    二  百分比的引入(需要一个jar包)
    1、引入

    其实我们的解决方案,就是在项目中针对你所需要适配的手机屏幕的分辨率各自简历一个文件夹。

    如下图:

    然后我们根据一个基准,为基准的意思就是:

        比如480*320的分辨率为基准

        宽度为320,将任何分辨率的宽度分为320份,取值为x1-x320
        高度为480,将任何分辨率的高度分为480份,取值为y1-y480

    例如对于800*480的宽度480:

    可以看到x1 = 480 / 基准 = 480 / 320 = 1.5 ;

    其他分辨率类似~~
    你可能会问,这么多文件,难道我们要手算,然后自己编写?不要怕,下文会说。

    那么,你可能有个疑问,这么写有什么好处呢?

    假设我现在需要在屏幕中心有个按钮,宽度和高度为我们屏幕宽度的1/2,我可以怎么编写布局文件呢?

    <FrameLayout >

        <Button
            android:layout_gravity="center"
            android:gravity="center"
            android:text="@string/hello_world"
            android:layout_width="@dimen/x160"
            android:layout_height="@dimen/x160"/>

    </FrameLayout>

    三 smallestWidth 限定符 适配原理

    smallestWidth 限定符适配原理与屏幕分辨率限定符适配原理一样,系统都是根据限定符去寻找对应的 dimens.xml 文件。例如程序运行在最小宽度为 360dp 的设备上,系统会自动找到对应的 values-sw360dp 文件夹下的 dimens.xml 文件。区别就在于屏幕分辨率限定符适配是拿 px 值等比例缩放,而 smallestWidth 限定符适配是拿 dp 值来等比缩放而已。需要注意的是“最小宽度”是不区分方向的,即无论是宽度还是高度,哪一边小就认为哪一边是“最小宽度”。如下分别为最小宽度为 360dp 与最小宽度为 640dp 所对应的 dimens.xml 文件:

     

    • 获取设备最小宽度代码为:
            DisplayMetrics dm = new DisplayMetrics();
            getWindowManager().getDefaultDisplay().getMetrics(dm);
            int heightPixels = dm.heightPixels;
            int widthPixels = dm.widthPixels;
            float density = dm.density;
            float heightDP = heightPixels / density;
            float widthDP = widthPixels / density;
            float smallestWidthDP;
            if(widthDP < heightDP) {
                smallestWidthDP = widthDP;
            }else {
                smallestWidthDP = heightDP;
            }
    

    为什么选择 smallestWidth 限定符适配?

    既然原理都一样,都需要多套 dimens.xml 文件,那为什么要选择 smallestWidth 限定符适配呢?

    1. 屏幕分辨率限定符适配是根据屏幕分辨率的,Android 设备分辨率一大堆,而且还要考虑虚拟键盘,这样就需要大量的 dimens.xml 文件。因为无论手机屏幕的像素多少,密度多少,90% 的手机的最小宽度都为 360dp,所以采用 smallestWidth 限定符适配只需要少量 dimens.xml 文件即可。
    2. 屏幕分辨率限定符适配采用的是 px 单位,而 smallestWidth 限定符适配采用的单位是 dp 和 sp,dp 和 sp 是google 推荐使用的计量单位。又由于很多应用要求字体大小随系统改变,所以字体单位使用 sp 也更灵活。
    3. 屏幕分辨率限定符适配需要设备分辨率与 values-xx 文件夹完全匹配才能达到适配,而 smallestWidth 限定符适配寻找 dimens.xml 文件的原理是从大往小找,例如设备的最小宽度为 360dp,就会先去找 values-360dp,发现没有则会向下找 values-320dp,如果还是没有才找默认的 values 下的 demens.xml 文件,所以即使没有完全匹配也能达到不错的适配效果。

    使用步骤

    1、以设计图最小宽度(单位为 dp)作为基准值,生成所有设备对应的 dimens.xml 文件

    生成这些文件当然不会手动去写,网上已经有大神 android阿杜 提供了自动生成工具。

    工具使用步骤:

    1. 在 Android Studio 中安装 ScreenMatch 插件,如图:

    1. 在项目的默认 values 文件夹中需要一份 dimens.xml 文件
      我在 github 源码已经提供了一份,直接复制过来即可。

    1. 执行生成
      插件安装好后,在项目的任意目录或文件上右键,选择 ScreenMatch 选项。如下图:

    然后选择在哪个 module 下执行适配。即基于哪个 module 下的 res/values/dimens.xml 文件作为基准 dimens.xml 文件,生成的其他尺寸 dimens.xml 文件放在哪个 module 下。例如选择 app,然后点击 OK ,出现如下界面表示生成文件成功。如下图:

    然后再看看 res 目录下会自动生成一堆 dimens.xml 文件,如下图:

    通过上面的步骤就已经生成了所有设备对应的 dimens.xml 文件。

    1. 根据设计图填写最小宽度基准值,并填写需要适配的设备最小宽度 dp 值

    步骤 3 是以插件默认的最小宽度基准值为 360dp,适配的设备最小宽度为
    384,392,400,410,411,432,480,533,592,600,640,662,720,768,800,811,820,960,961,1024,1280,1365(包含了平板和 TV )生成的文件,但实际情况要根据设计图和需求设置。

    例如设计图的最小宽度为 375dp,则需要更改最小宽度基准值为 375dp。如果项目只需要适配手机的话,适配的设备最小宽度保留 320,360,384,392,400,410,411,480 即可,若发现手机还有其他最小宽度自行加上即可,也麻烦把该最小宽度提供给我,我们一起来完善该份适配。

    以上修改需要在配置文件里修改,即screenMatch.properties 文件,该配置文件是执行完上面第 3 步后自动生成在项目的跟目录下的。如下图:

     

    打开配置文件,修改下图中 1、3、4 的值即可。(图中单位均为 dp)
    1:最小宽度基准值,填写设计图的最小宽度值即可。
    2:插件默认适配的最小宽度值,即默认情况下会生成如下值的 dimens.xml 文件。
    3:需要适配的最小宽度值,即你想生成哪些 dimens.xml 文件。
    4:忽略不需要适配的最小宽度值,即忽略掉插件默认生成的 dimens.xml 文件。

    配置文件修改完成后,重新执行第 3 步,生成新的 dimens.xml 文件。

    当然!如果你的设计图也是标准的 360dp,那么上面的步骤你可以忽略。直接复制我 github 上你需要的 dimens.xml 文件到你的项目即可,默认的 values 文件夹下也需要一份。

    2、根据设计图标注,在布局写上对应的值。

    设计图标注多少 dp,布局中就写多少 dp ,非常方便!

    • 大多数 UI 设计师提供设计图有如下几种方式:
      上传到蓝湖:显示多少 dp 就写多少 dp。
      psd 源文件:用像素大厨查看,显示多少 dp 就写多少 dp(注意像素大厨需要选择与设计图对应的dpi 进行显示)
      dp 单位的设计图:标注多少 dp 就写多少 dp。
      px 单位的设计图:叫 UI 设计师标注为 dp 单位或跟她要 psd 源文件,如果都不行,那自己算吧!
    • 举例:例如设计图上一个Button 的宽为 360dp,高为 50dp,字体大小为 15 sp,在布局中则这样使用:
        <Button
            android:layout_width="@dimen/dp_360"
            android:layout_height="@dimen/dp_50"
            android:textSize="@dimen/sp_15"/>
    
    • 代码中动态设置 dp 或 sp:
      如果需要在代码中动态设置 dp 或 sp,则需要通过 getDimension()方法获取对应资源文件下的 dp 或 sp 值再设置(具体参考 github 上的 demo)。如下:
            /*获取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值
    

    使用步骤总结

    说了这么多,其实只需要简单的 2 步:

    1. 以设计图最小宽度(单位为 dp)作为基准值,利用插件生成所有设备对应的 dimens.xml 文件
    2. 根据设计图标注,标注多少 dp,布局中就写多少dp,格式为@dimen/dp_XX。

    怎么适配其他 module?

    • 问题:在项目的其他 module 中怎么实现适配?难道也要多套 dimens 文件?
    • 解决:并不需要多套 dimens 文件,只需要在 values 文件夹下有一套与 app module 一样的 dimens 文件即可达到适配。因为经过编译,所有 module 中的 dimen 数据都会统一归类到主 module(即 app module)中的 values/dimens.xml 文件中了,然后系统又会根据你设置的值去找对应 values-swxxxdp 文件夹下的dimens.xml 文件中的值。
    • 验证:在项目中建一个 module,然后随便取一个 dimens.xml 文件中的值进行打印,分别运行在不同 widthDP 的设备上(用模拟器即可)观察打印的结果发现确实是这样的。

    常见问题汇总

    为什么宽度适配了,高度有时候没有完全适配?

    因为各种屏幕高宽比并不是固定的,有16:9、4:3,还有全面屏的19.5:9等等,如果强行将宽高都适配那只会导致布局变形。

    例如一个控件的宽高为360dp和640dp,如果将它显示在宽高为360dp和640dp的设备上是正常铺满整个屏幕的,但是显示在宽高为360dp和780dp的设备上高度则不能铺满,如果你让高度铺满,而宽度又保持不变,那就会出现变形的情况。所以这也就是为什么目前市面上的屏幕适配方案只能以宽或高一个维度去适配,另一个方向用滑动或权重的方式去适配的原因。

    那你为什么说高度也能适配呢?
    这里说的高度也能适配指的是在不同分辨率和密度的手机上能达到等比缩放的适配,其他屏幕适配方案也是一样的。

    如何同时适配横竖屏?

    • 方案一:(不推荐)
      计算出设备宽度和高度的dp值,然后生成对应的宽高 dimens.xml 文件。然后去掉所有 values-swXXXdp 目录上的s,即改为 values-wXXXdp。这样设备不管横竖屏都能找到对应的 values-wXXXdp 目录下的 dimens.xml 文件了。 虽然也能达到一定程度的适配,但是这样会增加很多 dimens.xml 文件,而且使用竖屏的设计图显示出来的效果也不够好。

    • 方案二:(推荐)
      因为横屏时宽高变化太大,想要横屏时也能完全适配,那就只能让设计师出一套横屏的设计图,然后单独写一套横屏的布局文件。

    注意:smallestWidth 限定符适配的效果是让不同分辨率和密度的设备上能达到以设计图等比缩放的适配,如果设备与设计图相差太大时并不能达到很好的适配效果,需要单独出图,其他屏幕适配方案也是一样的。

    如何适配平板、TV?

    同横屏道理一样,平板、TV 与手机的宽高差距太大,想要平板、TV 也能完全适配,那就只能让设计师出一套平板、TV 的设计图,然后单独写一套平板、TV 的布局文件。

    注意:再说一遍,smallestWidth 限定符适配的效果是让不同分辨率和密度的设备上能达到以设计图等比缩放的适配,如果设备与设计图相差太大时并不能达到很好的适配效果,需要单独出图,其他屏幕适配方案也是一样的。



    作者:wildma
    链接:https://www.jianshu.com/p/1302ad5a4b04
    来源:简书
    简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。

     

     

    展开全文
  • 种屏幕适配方式

    千次阅读 2015-11-23 19:49:42
    第一篇博客总结了三级缓存/AndroidStudio打包jar包/上传基本文件到github, 第二篇就接着总结一下三种屏幕适配的方式。 在这里也推荐一下张鸿洋的博客,关注挺久了,和郭霖的都很好。第一种方式,dimens中设置不同...
    第一篇博客总结了三级缓存/AndroidStudio打包jar包/上传基本文件到github, 第二篇就接着总结一下三种屏幕适配的方式。
    

    在这里也推荐一下张鸿洋的博客,关注挺久了,和郭霖的都很好。

    第一种方式,dimens中设置不同dp值,来达到适配的目的
    第二种方式,利用第三方百分比库
    第三种方式,利用第三方库:AutoLayout

    第一种方式 更改dimens

      这种方式也是以前使用的最多的一种方式,通过针对不同的分辨率来设置不同的值,达到不同屏幕适配的目的。但是还是有可能会有一些很奇葩的机型匹配不到,不过只要照顾到90%的手机,匹配基本就算成功了。
      相关用法参考:http://blog.csdn.net/lmj623565791/article/details/45460089

    第二种方式 利用百分比库

    这种方式是前段时间出的,挺不错,利用屏幕的百分比来协调布局,达到屏幕适配的目的。这个库虽然不是谷歌官方出的但是已经获得了官方承认
    相关用法参考:github: https://github.com/hongyangAndroid/android-percent-support-extend
    

    第三种方式 AutoLayout

    这种方式也是今天才刚看到的,这种方式较之上面两种更好用,可以直接根据设计人员的设计图纸来设置布局,相当不错。
    参考博客: http://blog.csdn.net/lmj623565791/article/details/49990941
    github地址:https://github.com/hongyangAndroid/AndroidAutoLayout
    

     个人使用总结:
     1. git clone https://github.com/hongyangAndroid/AndroidAutoLayout.git
    2. compile project(':autolayout')
    3. <meta-data
    android:name="design_width"android:value="1080"></meta-data>
    <meta-data
    android:name="design_height"
    android:value="1920"></meta-data>

    4.在Activity的onCreate方法中调用AutoLayout.getInstance().auto(this, true);
    5.布局文件中:AutoLinearLayout / AutoRelativeLayout / AutoFrameLayout
    6.在之后的布局中,所有的dp改为px就好了,textSize也是一样
    7.TextView控件textSize目前存在一点问题,需要比设计人员的图稍微小一点

    展开全文
  • Android 屏幕适配几种方法

    千次阅读 2020-05-12 15:40:50
    android中的dp在渲染前会将dp...根据当前市面上手机的屏幕的分辨率创建不同的文件夹,系统运行的时候,会自动去选择读取对应的文件夹中的xml,即每种屏幕分辨率的设备需要定义一套 dimens.xml 文件 缺点是:假设我.
  • 安卓-屏幕适配的五种方式

    千次阅读 2016-04-07 09:19:36
    安卓-屏幕适配方式 @(Blog)[马克飞象|Markdown|Android] 安卓-屏幕适配方式 适配方式一图片适配适配方式二dimensxml文件适配适配方式三布局文件适配适配方式四java代码适配适配方式五权重适配 ...
  • 针对Android屏幕适配所整合的几种常用方案
  • 屏幕适配几种常用方法

    千次阅读 2016-08-04 15:19:27
    首先在开发者我们要养成一个良好的开发习惯,遵循一些好的屏幕适配原则: 开发前部分阶段:比如尽量不用AbsoluteLayout(绝对布局),多用线性布局与相对布局,设置宽高边距等尺寸用dp(dip),不要用px。开发调试选择...
  • flutter 屏幕适配 demomain 一一劳永逸的全局适配方式 效果 320x480 1080x1920 原理 (具体代码main) 1.更改配置的 ViewConfiguration 的size和devicePixelRatio (ViewConfiguration 这个类再 ...
  • 谈谈移动端屏幕适配几种方法

    万次阅读 2018-07-09 17:48:14
    文/腾讯 莫振中移动端web开发相对于PC端web开发,我们可以庆幸不用兼容那么多浏览器了,但是随之而来的却是各种屏幕尺寸的适配,个人觉得,比PC端还要费精力。在使用了腾讯优测进行软件测试后,问题得到了有效解决...
  • 极低成本的Android屏幕适配方式

    千次阅读 2018-06-27 19:50:45
    前言:前段时间在一个技术网站中看到一篇文章:一极低成本的Android屏幕适配方式,原文地址:https://mp.weixin.qq.com/s/d9QCoBP6kV9VSWvVldVVwA,拜读后感觉方法很独特,直接从源码着手解决问题,动手实践了一下...
  • 移动端适配几种方式

    万次阅读 2019-06-12 01:12:41
    百分比适配方式 这种方法,只是宽度能适配,高度不能适配,只能设置某个高度固定死 需求:是四个div高度为100px,宽度等宽横向排列 <!DOCTYPE html> <html lang="en"> <head> <meta ...
  • 屏幕适配目前来说常用的有5方案,sw限定符适配不做讲解 像素适配(px适配), 百分比适配, 通过修改系统的density适配, 对于谷歌9.0推出的刘海屏,也需要做到刘海屏适配。 代码动态适配 我们在开发界面的...
  • 移动端web开发相对于PC端web开发,我们可以庆幸不用兼容那么多浏览器了,但是随之而来的却是各种屏幕尺寸的适配,个人觉得,比PC端还要费精力。在使用了腾讯优测进行软件测试后,问题得到了有效解决。 响应式布局 ...
  • 学习一极低成本的Android屏幕适配方式 学习今日头条技术团队–&amp;amp;gt;一极低成本的Android屏幕适配方式 文章中刚开的的计算供着个参数就没弄懂,搜了2遍不错的文章 两分钟理解Android中PX、DP...
  • Android 屏幕适配解决方案大全
  • IOS屏幕适配

    千次阅读 2016-12-18 00:15:36
    简介屏幕适配一直是移动端开发一个非常蛋疼的问题,前天和产品狗沟通一个Android项目,它觉得这个软件应该在任何手机上显示的都应该是一模一样的,一点都不能缩放,还夸下海口,哪怕只适应一机型,然后程序猿...
  • android屏幕适配

    2013-04-22 07:26:19
    这个是我们老师讲的几种android屏幕适配,不错哦。上传分享给正在学习的童鞋。
  • Android 中屏幕适配几种方式
  • rem、px、em(手机端h5页面屏幕适配几种方法)

    万次阅读 多人点赞 2016-12-06 11:30:08
    pc端使用px倒也无所谓,可是在移动端,因为手机分辨率种类颇多,不可能一个个去适配,这时px就显得非常无力,所以就要考虑em和rem。 em 相对于父节点的font-size,会有一些组合的问题。比如你把body的font-size...
  • 随着时代的发展,我们的手机的分辨率越来越高,并且伴随着的尺寸也越来越多,对于android程序开发的我们,大多数android手机屏幕适配也成为了一个问题,因为不像以前只有几种规定尺寸及分辨率的手机了所以这个问题...
  • 极低成本的Android屏幕适配方式 今日头条技术团队 5月25日 每天叫醒你的不是闹钟,而是姿势 在Android开发中,由于Android碎片化严重,屏幕分辨率千奇百怪,而想要在各种分辨率的设备上显示基本一致的效果...
  • Android 屏幕适配

    千次阅读 2019-08-25 17:12:46
    Android 发展到现在,已经到了Android Q。前天的新闻,Google结束以“甜点”命名...身为一个Android开发者,就必须了解Android的屏幕适配。 1.px 和 dp 分辨率(px) 分辨率就是手机屏幕的像素点。一般为屏幕...
  • 转自:一极低成本的Android屏幕适配方式 在Android开发中,由于Android碎片化严重,屏幕分辨率千奇百怪,而想要在各种分辨率的设备上显示基本一致的效果,适配成本越来越高。虽然Android官方提供了dp单位来适配,...
  • Android屏幕适配

    千次阅读 2016-10-26 16:19:48
    (一)背景知识为什么需要屏幕适配 Android是一个开放的系统,全球各种用户、手机企业、OEM厂商都可以对Android系统进行定制,这就导致了Android系统的碎片化问题。其中对于开发者来讲工作中最常碰到的就是屏幕碎片...
  • Android屏幕适配全攻略(最权威的官方适配指导)

    万次阅读 多人点赞 2015-05-19 11:34:17
    Android的屏幕适配一直以来都在折磨着我们这些开发者,本篇文章以Google的官方文档为基础,全面而深入的讲解了Android屏幕适配的原因、重要概念、解决方案及最佳实践,我相信如果你能认真的学习本文,对于Android的...
  • android屏幕适配方法

    2017-08-22 11:52:39
    android屏幕适配方法
  • 屏幕适配几种,目前主流且成本最低的还是修改系统density的方案。 概念 像素:屏幕的最小单位,单位为px。 分辨率:整个屏幕一共有多少个点,也就是像素。例如分辨率1920*1080就是指屏幕横向和纵向分别是1920和...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 28,232
精华内容 11,292
热门标签
关键字:

屏幕适配的几种方式