Android 不同分辨率下屏幕适配的实战方案与经验总结

Android 开发中,屏幕适配是一大考点,几乎每一场面试,都不会落下这个问题,这个问题说简单也简单,说难也难,当然对于有过真实的适配经验的人来说,这个根本不算什么问题,从坑里爬过的人,自然知道这其中的水深水浅,哈哈。今天总结分享下自己在项目中关于屏幕适配的一些实战经验,作为自己从事Android开发以来的一篇温故与告白!
方案一:使用多个values下的dimens.xml文件来进行适配。
Android 不同分辨率下屏幕适配的实战方案与经验总结_第1张图片
看到了吧,平时我们项目的res目录下一般只会有一个values目录,这里要讲的适配不同屏幕的方案就是根据各个屏幕尺寸的屏幕分别建立对应的目录和其中对应的dimens.xml文件,每一个标准的“dp_”+“数字”在不同的deimens.xml文件中指向的数字是不一样的,比如

正常的values下的deimens.xml中dp_1的值

<dimen name="dp_1">1.0667dpdimen>

而在values-sw1365dp目录的deimens.xml文件中dp_1的值则是

<dimen name="dp_1">3.7917dpdimen>

调用也很简单:

            "@dimen/dp_45"
                android:layout_height="@dimen/dp_45"
                android:layout_alignParentEnd="true"
                android:layout_alignParentRight="true"
                android:layout_centerVertical="true"/>

这就是这个方案能解决不同尺寸屏幕分辨率下能够自适应的原因。因为相同的一个dp数值,在不同的屏幕分辨率中,真实赋值的dp数值是适合这个屏幕本身的。
这个方案的缺点就是前期麻烦一点,你需要下载这些不同屏幕对应的demens目录和文件到自己项目的res目录下(这里附上下载这些资源的地址,点击可以跳转下载),但优点就是后期用起来你会觉得很清爽方便。

方案二:使用线性布局LinearLayout的weight属性,这个是最最根本最直观解决问题的方法。缺点是比较复杂有时会,当然,只有在比较复杂的布局适配中才会选用它。比如看下面的一个例子该图片来自这篇博客,它里面会讲具体的布局更清晰一点:
Android 不同分辨率下屏幕适配的实战方案与经验总结_第2张图片
这个布局里面,如果你仔细看会发现,背景图是单独的一个imageview显示一个大图,手是单独的一个imageview显示一张大图,而每一个手指上的指甲区域又是一个个单独的imageview控件,再往下看,你会发现适配的难题来了,如何能保证这个手的图片在不同的屏幕分辨率显示的时候,能保证它上面的五个指甲的位置刚好不错位,如果错了一点位置,就会露出染色指甲下面的肉色区域,会很明显的被人看出来是个bug,写死dp值肯定是不行的,用方案一解决的话也可以,但不够科学,不够放心,如果有一点点的小瑕疵,就会出大事情了。答案是这五个手指适配一张手的图片,五个手指和手的图片都需要用weight属性控制适配。而他们用来匹配分割的对象都是整个屏幕,这样才绝对公平,不会有错误。
也就是说,每一个手指甲imageview和放手的图片的imageview控件都单独放在了各自对应的一个两层嵌套的线性布局中,对宽和高都根据屏幕做了weight属性,这样就保证了不论什么分辨率下的屏幕下他们都是按照能够完全吻合的比例显示的,也就不会出现错误的现象。
代码举例如下:

<RelativeLayout
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:layout_marginTop="@dimen/dp_10">

             
            <LinearLayout
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                android:orientation="horizontal">
                
                <View
                    android:layout_width="0dp"
                    android:layout_height="wrap_content"
                    android:layout_weight="1"/>

                <LinearLayout
                    android:layout_width="0dp"
                    android:layout_height="match_parent"
                    android:layout_weight="5"
                    android:orientation="vertical">
                    
                    <View
                        android:layout_width="match_parent"
                        android:layout_height="0dp"
                        android:layout_weight="1"/>

                    <ImageView
                        android:id="@+id/iv_zodiac_bg"
                        android:layout_width="match_parent"
                        android:layout_height="0dp"
                        android:layout_weight="5" 
                        android:src="@drawable/pic_bg_zodiac" />

                    <View
                        android:layout_width="match_parent"
                        android:layout_height="0dp"
                        android:layout_weight="1"/>

                LinearLayout>

                <View
                    android:layout_width="0dp"
                    android:layout_height="wrap_content"
                    android:layout_weight="1"/>

            LinearLayout>

            ...  此处省略其余控件的具体的适配代码

 RelativeLayout>

这样最后就确认了一个布局或者控件在不同屏幕不通分辨率中,显示的位置和比重都是一样的,也就不会发生错位的现象。

以上是我个人总结的关于Android屏幕自适应方面的一些经验,如果您看出来有不规范或者有遗漏或者错误的地方,欢迎在博客底部留言指正,如果有兴趣的也可以留言一起深度讨论探究,写博客的目的本身就是为了提升自己嘛,哈哈!

你可能感兴趣的:(android)