您的位置:首页 > 职场人生

腾讯面试后感悟的Android适配原理

2016-11-22 14:34 253 查看

为何要使用适配

其实在一开始的时候。我接触的Android认知可能就是Android的机型太多。理应找一个好的适配框架,然后也学习了鸿详大神的一些适配原理。确实也应用到框架体系里面。适配也还算挺成功的。

然鹅,在上一次腾讯的面试中,好像这点就栽了很大的跟斗,当面试官问道我的框架适配的时候,我信心满满说出自己的见解,然后说出了自己是怎么把适配框架应用到自己的Android项目里的。当我还沉浸在自己的世界一顿海说的时候

面试官直接:“咳咳~ 那个, 你说你用的这套适配框架我赞同, 请问一下您, 为何没有考虑过谷歌原生的适配框架呢?”

我:“ 这个。 (我确实没有看过原生的。当时适配要的急,直接询问了个大神,大神推荐给我的适配,我就直接去学习看的。确实没有考虑过适配的前因后果) ” 我临场能力还是很强:” 然后补充道,原生的适配在很多不同的机型上还是有局限性,所以没考虑,直接用的现在这套体系”

面试官一听好像也有怎么回事,继续补充道:“哦? 那可以深入的说一下谷歌的适配的缺陷性吗?”

我:“GG”

从腾讯大楼出来以后还是挺后悔的。腾讯毕竟也还是万千程序猿想去的公司包括我,然而自己却浪费了这一次的大好机会,不过也确实是自己还有知识的缺陷性。所以打算好好整理一番,斗志不能缺。诶~ 迟早。我王老五还会杀回去的。

Android屏幕适配出现的原因

下面这张图片所显示的内容足以充分说明当今Android系统碎片化问题的严重性,因为该图片中的每一个矩形都代表着一种Android设备。



dp、dip、dpi、sp、px

px我们应该是比较熟悉的,前面的分辨率就是用的像素为单位,大多数情况下,比如UI设计、Android原生API都会以px作为统一的计量单位,像是获取屏幕宽高等。

dip和dp是一个意思,都是Density Independent Pixels的缩写,即密度无关像素,上面我们说过,dpi是屏幕像素密度,假如一英寸里面有160个像素,这个屏幕的像素密度就是160dpi,那么在这种情况下,dp和px如何换算呢?在Android中,规定以160dpi为基准,1dip=1px,如果密度是320dpi,则1dip=2px,以此类推。

假如同样都是画一条320px的线,在480*800分辨率手机上显示为2/3屏幕宽度,在320*480的手机上则占满了全屏,如果使用dp为单位,在这两种分辨率下,160dp都显示为屏幕一般的长度。这也是为什么在Android开发中,写布局的时候要尽量使用dp而不是px的原因。

而sp,即scale-independent pixels,与dp类似,但是可以根据文字大小首选项进行放缩,是设置字体大小的御用单位。

Google官方指定按照下列标准进行区分:

名称 像素密度范围

mdpi 120dpi~160dpi

hdpi 160dpi~240dpi

xhdpi 240dpi~320dpi

xxhdpi 320dpi~480dpi

xxxhdpi 480dpi~640dpi

mdpi、hdpi、xdpi、xxdpi用来修饰Android中的drawable文件夹及values文件夹,用来区分不同像素密度下的图片和dimen值。

使用尺寸
4000
限定符

很多应用会在较大的屏幕上实施“双面板”模式,即在一个面板上显示项目列表,而在另一面板上显示对应内容。平板电脑和电视的屏幕已经大到可以同时容纳这两个面板了,但手机屏幕就需要分别显示。因此,我们可以使用以下文件以便实施这些布局:

res/layout/main.xml,单面板(默认)布局:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent">

<fragment android:id="@+id/headlines"
android:layout_height="fill_parent"
android:name="com.example.android.newsreader.HeadlinesFragment"
android:layout_width="match_parent" />


res/layout-large/main.xml,双面板布局:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="horizontal">
<fragment android:id="@+id/headlines"
android:layout_height="fill_parent"
android:name="com.example.android.newsreader.HeadlinesFragment"
android:layout_width="400dp"
android:layout_marginRight="10dp"/>
<fragment android:id="@+id/article"
android:layout_height="fill_parent"
android:name="com.example.android.newsreader.ArticleFragment"
android:layout_width="fill_parent" />


使用最小宽度限定符

res/layout/main.xml,单面板(默认)布局:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent">

<fragment android:id="@+id/headlines"
android:layout_height="fill_parent"
android:name="com.example.android.newsreader.HeadlinesFragment"
android:layout_width="match_parent" />


res/layout-sw600dp/main.xml,双面板布局:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="horizontal">
<fragment android:id="@+id/headlines"
android:layout_height="fill_parent"
android:name="com.example.android.newsreader.HeadlinesFragment"
android:layout_width="400dp"
android:layout_marginRight="10dp"/>
<fragment android:id="@+id/article"
android:layout_height="fill_parent"
android:name="com.example.android.newsreader.ArticleFragment"
android:layout_width="fill_parent" />


使用布局别名

res/layout/main.xml: 单面板布局

res/layout-large: 多面板布局

res/layout-sw600dp: 多面板布局

使用屏幕方向限定符

某些布局会同时支持横向模式和纵向模式,但我们可以通过调整优化其中大部分布局的效果。在新闻阅读器示例应用中,每种屏幕尺寸和屏幕方向下的布局行为方式如下所示:

小屏幕,纵向:单面板,带徽标

小屏幕,横向:单面板,带徽标

7 英寸平板电脑,纵向:单面板,带操作栏

7 英寸平板电脑,横向:双面板,宽,带操作栏

10 英寸平板电脑,纵向:双面板,窄,带操作栏

10 英寸平板电脑,横向:双面板,宽,带操作栏

电视,横向:双面板,宽,带操作栏

谷歌适配为什么有局限性呢?

谷歌的dp其实就已经做了适配呢

我们都已经用了dp了,为什么会出现这种情况呢?

你听我慢慢道来。

虽然说dp可以去除不同像素密度的问题,使得1dp在不同像素密度上面的显示效果相同,但是还是由于Android屏幕设备的多样性,如果使用dp来作为度量单位,并不是所有的屏幕的宽度都是相同的dp长度,比如说,Nexus S和Nexus One属于hdpi,屏幕宽度是320dp,而Nexus 5属于xxhdpi,屏幕宽度是360dp,Galaxy Nexus属于xhdpi,屏幕宽度是384dp,Nexus 6 属于xxxhdpi,屏幕宽度是410dp。所以说,光Google自己一家的产品就已经有这么多的标准,而且屏幕宽度和像素密度没有任何关联关系,即使我们使用dp,在320dp宽度的设备和410dp的设备上,还是会有90dp的差别。当然,我们尽量使用match_parent和wrap_content,尽可能少的用dp来指定控件的具体长宽,再结合上权重,大部分的情况我们都是可以做到适配的。

以上资料很多来自一叶漂舟大神还想看更详细的,可以去观看这篇博客,非常详细

http://blog.csdn.net/jdsjlzx/article/details/45891551

适配原理思路

大家拿到UI给的设计图以后,是不是抱怨过尼玛你标识的都是px,我项目里面用dp,这什么玩意,和UI人员解释,UI妹妹也不理解。那么本例同样可以解决Android工程师和UI妹妹间的矛盾~UI给出一个固定尺寸的设计稿,然后你在编写布局的时候不用思考,无脑照抄上面标识的像素值,就能达到完美适配,理想丰不丰满~~。

但是web前段人员却从来没有适配的困扰。因为前段的适配的思路从来都是百分比的。Android却没有这种布局, 可能就需要认为的计算

我们再来看看一些适配的tips

多用match_parent

多用weight

自定义view解决

其实上述3点tip,归根结底还是利用百分比,match_parent相当于100%参考父控件;weight即按比例分配;自定义view无非是因为里面多数尺寸是按照百分比计算的;

通过这些tips,我们更加的看出如果能在Android中引入百分比的机制,将能解决大多数的适配问题,下面我们就来看看如何能够让Android支持百分比的概念。

更详细的引入还是去看大神的适配引入吧

http://blog.csdn.net/lmj623565791/article/details/45460089

不过谷歌也开始引入百分比的机制来进行Android的适配了

http://blog.csdn.net/lmj623565791/article/details/46695347
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  android 面试