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

为何要使用适配

其实在一开始的时候。我接触的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值。

使用尺寸限定符

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

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" />  

使用布局别名

  1. res/layout/main.xml: 单面板布局
  2. res/layout-large: 多面板布局
  3. 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

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Android是指将应用程序在不同的Android设备上进行优化和调整,以确保应用能够在各种屏幕尺寸、分辨率和设备类型上正常运行。涉及到以下几个方面: 1. 布局:根据不同屏幕尺寸和分辨率调整布局,保证界面元素的合理排列和显示效果。可以使用ConstraintLayout、LinearLayout等布局管理器来实现自应布局。 2. 图片:提供不同分辨率的图片资源,并根据设备的屏幕密度加载合的图片。可以通过资源文件夹的命名方式(如drawable-hdpi、drawable-xhdpi等)来管理不同分辨率的图片。 3. 字体:根据设备的屏幕密度和用户设置的字体大小,调整应用中的文字大小和样式。可以使用sp(可缩放像素)作为字体大小的单位,以支持用户自定义字体大小。 4. 功能:根据设备的硬件特性和系统版本,判断是否支持某些功能或API,并进行相应的处理。可以使用特定的API或兼容性库来实现功能。 5. 版本:针对不同的Android版本,处理其特有的行为和API差异。可以使用条件判断、动态加载类等方式来处理不同版本的兼容性问题。 6. 设备:根据设备的硬件特性和屏幕尺寸,调整应用的功能和界面。可以使用资源限定符、特定的API等来实现设备。 以上是Android的一些常见方面,具体的策略和方法,可以根据应用的需求和目标设备的特点进行选择和实施。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值