プライマー
画面の適応はアンドロイドである 開発/インタビュー 問題を周りに開いていません。この記事では、の適応スクリーンます
知识要点
読者への完全なショーを。
ボディ概要
その理由のアンドロイド画面の適応が行われる必要があります
基本ポイント(非常に重要)
画面の適応レイダース
テキスト
その理由のアンドロイド画面の適応が行われる必要があります
キーワード:android碎片化
アンドロイドの開始以来、Androidのオープンソースシステムをグーグル、様々なメーカーがない均一な標準画面サイズで、その結果、断片化し、画面のアスペクト比が、多種多様な画面密度もAndroidの開発につながる資本のさまざまなメーカーの比較は、使用したいです機器のすべてに適合するためのコードがあるが、特に困難になってきたグーグルの代わりにPXのDPユニットを、DPが、まだ完全には収まらないその場所を持っています。
これは、我々は場所の適応を完了するために他の手段を使用する必要があり、です。
インタビューのポイント
Q:画面の適応について、なぜしている
dp
ユニットはまだそれに合わせてありますか?
A:dp
アダプタは、適応することができない、ほとんどの場合、しかし、いくつかのモデルのための問題を解決することができますが
:理由dp
既存のに単位をandroid
市場環境、不可靠
およびタイムコードをdp
実行時に、変換しpx
、この時点で当初の設計の正確に制御PXのUIにすることはできません。
ほとんどの視覚的表現は次のとおりです。同様に300dp
、Aの携帯電話にすることができ全幅を埋めるが、Bの携帯電話上で、以下を占め、または完全な幅を超えます。至于为什么dp不可靠?
私は後で説明します。
基本ポイント(非常に重要)
次の概念は、基本的には、レイダースが障害を持って後ろに複雑さを理解するために、リンクを逃し、非常に基本的な、しかし非常に重要です。
1.ピクセル
ピクセルが説明する用語の物理的な概念であり、以下のように、この通路は次のとおりです。
通常所说的像素,就是CCD/CMOS上光电感应元件的数量,一个感光元件经过感光,光电信号转换,A/D转换等步骤以后,在输出的照片上就形成一个点,我们如果把影像放大数倍,会发现这些连续色调其实是由许多色彩相近的小方点所组成,这些小方点就是构成影像的最小单位“像素”(Pixel)。简而言之,像素就是手机屏幕的最小构成单元。
簡単に言えば、ピクセルがあります屏幕上色彩区域的最小单位
。すべてのデバイスでは、1ピクセルは同じです。UIの妹は通常、ピクセル単位にプロットしました。
2.解像度
例えば:1920 1080解像度、現在のデバイスを示す画面が横1080なされる 垂直1920の画素から組成物。
3.画面サイズ
画面の対角線の長さ。通常インチ、一般的な画面サイズで
4.7
、5.5
、6.0
。
4.画面密度
定义:
一平方英寸
面积内,存在多少个
像素点。
同样是1920*1080
的分辨率,存在两款手机,一个是4.7英寸,一个是6.0英寸,这两者的像素密度
是不一样的。
屏幕密度的单位: dpi(dots per inch).
标准屏幕分辨率 :160dpi 。即:一平方英寸
面积,存在160
像素点。(mdpi).
5. 屏幕尺寸,分辨率,像素密度 三者之间的关系
像素密度
,可以由屏幕尺寸
和分辨率
计算得出。
计算公式为:比如下图所示:
我这里有一块1920*1080的5寸屏幕,通过上面的公式计算得出,它的像素密度为 440dpi .
可见,px是和像素密度有直接关系的 像素单位。
6. 密度无关的像素单位(dp,或者dip)
全英文为:density-independent pixel.
(注意此处是dip
,上面的像素密度是dpi
, 千万不要因为这个,在面试的时候出丑 )
使用dp作为长度单位,可以保证在不同的屏幕像素密度的手机上显示 很相似的效果。
比如: 使用480x800
的手机上,要画一条长度为一半屏幕宽的线条,我们可以设置线条的长度为240px
,而在320x480
的屏幕上,我们只需要160px
,但是我们可以直接使用160dp
,来同时让两个屏幕上的这条线占全宽的一半。
px和dp的换算公式为:
px = dp * (dpi / 160)
公式解读:
如果有一个屏幕密度为 160dpi的手机,在它上面,1px=1dp;
而如果是 320dpi的手机,则 1px = 0.5dp.
简而言之规律就是: 屏幕像素密度(dpi)越高的手机,1dp所代表的px就越多.
下面解释为什么dp有时候靠不住.
如果UI小姐姐以
320*480
dpi160
的屏幕为标准,画了一条长度为160px
的线,长度为屏幕宽度的一半
,这个时候,你直接用160dp
,一般就能完成适配。但是如果这样的布局 运行在320x480
分辨率,但是屏幕密度为150dpi
略小于160dpi
,这个时候 你布局里面写的160dp
就会实际超过160px
不再是占屏幕宽的一半,而是略微超过。
7. 独立比例像素 (sp)
全英文为: scale-independent pixel (简称sp或者sip)
专门用于字体大小表示。
推荐使用12sp
以上的偶数作为 字体大小, 不要使用奇数,或者浮点型小数,因为容易造成精度丢失。
面试点
Q: sp和dp有什么区别?
A: 通常情况下,dp和sp效果类似,但是有一点,如果用户 调整了手机字体,比如 从标准,变成了 超大,那么,1dp 原本等于1px依然不变,但是1sp就会从1px变成3px(只是举个例子,数值不必认真).
因此,在用户调整字体的情况下,同样的布局,可能出现 窗口大小不变,但是文字尺寸发生变化的情况。
屏幕适配攻略
1. 布局适配
使用多套布局适应不同屏幕。此方法必须要了解
布局限定符
的概念。
如图:限定符: 在原本的
layout
后面加上横杠,然后加上限定名。形成 layout-XXX的形式,具体规则请参考谷歌官网: https://developer.android.google.cn/training/multiscreen/screensizes, 重点摘录如下:使用上面的限定符,几乎可以解决所有的适配问题,但是另外还有一个小技巧帮我们节省工作量 :布局别名.
适用情形为:当多个加了限定符的 layout.xml中都引用了同一个 子布局,而子布局的内容可能相同,也可能不同。
这个时候,使用布局别名,可以节省操作量。
方案评价: 讲道理,这个是
下下策
,因为在你需要修改布局的时候,你可能需要修改多套布局,这个要多恶心就多恶心,懂的人都懂.
2 代码适配
我们通过java代码去获取屏幕的宽高,动态去指定控件的宽高 。
获取屏幕宽高的方式我不想在这里占篇幅。
代码适配,一般用于动态创建 控件,或者自定义view自己绘制图形的时候。
特别提一下接口适配:当你去向后台请求图片的时候,我们可以在参数中带入屏幕的宽高,或者是控件的宽高,来获取我们想要的图片,在图片返回之后直接就能显示得最优,而不需要我们app代码中多动手脚。
方案评价:这个比下下策稍微好一点,但是
控件大小
直接进入了代码,还是让代码不够雅观.
3. 布局组件的适配
尽量直接通过一套布局解决所有的麻烦,这个就叫布局组件的适配。这个是上上策.
包含如下手段:
使用像素密度无关的单位
dp sp
杜绝使用绝对布局,多使用相对和线性布局
多使用 wrap_content match_parent 以及线性布局的权重
多用 minWidth minHeight,lines 等属性
使用多套限定的 dimens中定义的尺寸
可能面试点
Q:同一个布局文件中,我使用线性布局和相对布局都可以达成目的,那么如何抉择?
A: 使用相对布局,很有可能出现 第一次测量"不满意"的情况,从而会测量第二次。如果两者都可以达成目的,并且两者的布局层级相同,并且线性布局中没有使用到权重
(权重可能也会触发第二次测量
),此时,优先使用线性布局。 除此之外,都选择相对布局。
结语
屏幕适配,工作中并不困难,但是面试多会问到。
现今主流的两种完美适配方案,有头条方案(直接变更DisplayMetrics中的density),以及 多套dimens适配方案,两者各有千秋。