Android屏幕适配篇(一)

来源:互联网 发布:信鸽群发软件 编辑:程序博客网 时间:2024/06/05 01:56

Android碎片化特别严重,屏幕适配一直都是热点讨论的话题,可能你想过很多办法,最后都不是很满意。
屏幕适配篇(一)也是基础篇,主要是对一些基础概念的讲解,如果你已经了解,请关注(二)。

1、屏幕尺寸**

屏幕的尺寸​指的是屏幕对角线的长度,单位是英寸(1英寸=2.54厘米)。常见的屏幕尺寸有 4.0,5.0,5.5,6.0,8.0,10.0等,平时我们说你手机又多大,这里指的就是屏幕尺寸。

2、屏幕分辨率**

屏幕分辨率指的是屏幕上横向,纵向上的像素点数量。单位是px,1px=1个像素点。我们通常以横向像素*纵向像素来表示。如320*480,1080*1920等。

3、屏幕像素密度**

密度跟数学上的密度有些相似,指的是每英寸上的像素点数,单位是dpi。当然密度越大屏幕越清晰。在单一变化的条件下,屏幕尺寸越小,分辨率越高,像素密度就越大,反之越小。

dip和dp是一个意思,即Density Independent Pixels的缩写,dp和px又是如何换算的呢?

    /**      * 根据手机的分辨率从 dp 的单位 转成为 px(像素)      */      public static int dip2px(Context context, float dpValue) {          final float scale = context.getResources().getDisplayMetrics().density;          return (int) (dpValue * scale + 0.5f);      }      /**      * 根据手机的分辨率从 px(像素) 的单位 转成为 dp      */      public static int px2dip(Context context, float pxValue) {          final float scale = context.getResources().getDisplayMetrics().density;          return (int) (pxValue / scale + 0.5f);      } 

在Android中,规定以160dpi为基准,1dip=1px,如果密码是480dpi,则1dpi=3px,以此类推。​​下面我们来看一个假设,在屏幕上我们画一条320px的线,在840*800分辨率的手机上显示为屏幕的2/3,在320*480分辨率的手机上则占满了屏幕的宽度。如果使用dp为单位,在这两种分辨率的手机上,显示一样的长度,这也是我们在写布局的时候尽量使用dp而不是px的原因。而sp可以根据文字大小首选项进行缩放,是设置字体大小的单位。​

4、mdpi(1x)、hdpi(1.5x)、xdpi(2x)、xxdpi(3x)

mdpi、hdpi、xdpi、xxdpi用来修饰Android中drawable文件夹及values文件夹,用来区分不同像素密度下的图片和dimen值。在进行开发的时候,我们需要把合适大小的图片放到合适的文件夹里面:

drawable文件夹 图片尺寸 mdpi(~160dpi) 48x48dp hdpi(~240dpi) 72x72dp xhdpi(~320dpi) 96x96dp xxhdpi(~480dpi) 144x144dp xxxhdpi(~640dpi) 192x192dp

对于以上五种主流的像素密度,应按照2:3:4:6:8的比例进行缩放​。从android 4.3 mipmap文件夹已经替换掉了drawable文件夹。mipmap文件夹性能更好,占用内存更少。所以现在官方推荐使用mipmap。

5、​线性布局中weight(权重)的使用

相信大家一定对weight不陌生​,我们可以使用这个属性来按照比例对界面进行分配,完成一些特殊的需求。那么我们如何来理解它呢?下面我简单的举个列子:

android:layout_width=”0dp”

<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"    android:layout_width="match_parent"    android:layout_height="match_parent"    android:orientation="horizontal">    <TextView        android:layout_width="0dp"        android:layout_height="32dp"        android:layout_weight="1"        android:background="#ff0000"></TextView>    <TextView        android:layout_width="0dp"        android:layout_height="32dp"        android:layout_weight="1"        android:background="#00ff00"></TextView></LinearLayout>

效果图:

screen

如果红色TextView的layout_weight=“2”呢:

screen

那么layout_weight所占父控件的比例公式为:子控件的weight值/(所有子控件的weight值的和)*父控件的宽度或者是高度。

android:layout_width=”wrap_content”

<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"    android:layout_width="match_parent"    android:layout_height="match_parent"    android:orientation="horizontal">    <TextView        android:layout_width="wrap_content"        android:layout_height="32dp"        android:layout_weight="2"        android:text="你是红色"        android:background="#ff0000"></TextView>    <TextView        android:text="我是蓝色"        android:layout_width="wrap_content"        android:layout_height="32dp"        android:layout_weight="1"        android:background="#00ff00"></TextView></LinearLayout>

效果图:

screen

结论:子控件的weight值/(所有子控件的weight值的和)* 剩余空间的宽度或高度

注意:有些资料可能没有区分清楚wrap_content 和 0dp 的情况,或者说它们情况是一样的。

android:layout_width=”match_parent”

<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"    android:layout_width="match_parent"    android:layout_height="match_parent"    android:orientation="horizontal">    <TextView        android:layout_width="match_parent"        android:layout_height="32dp"        android:layout_weight="1"        android:text="你是红色"        android:background="#ff0000"></TextView>    <TextView        android:text="我是蓝色"        android:layout_width="match_parent"        android:layout_height="32dp"        android:layout_weight="2"        android:background="#00ff00"></TextView></LinearLayout>

效果图:

screen

结论:假设每个TextView的宽度为​match_parent,如果我们设父控件的宽度为M,那么每个TextView的宽度都为M,那么剩余的宽度我们就可以求出来 M-(M+M)=-M。红色TextView的weight=1,剩余的宽度占比为:1/(1+2)=1/3,所有我们就得出了它的最终宽度为M+1/3*(-M)=2/3M,蓝色的TextView所占宽度同浅绿色TextView的算法,最终宽度为M+2/3*(-M)=1/3M。

理解清楚了一些基本概念,下篇我会讲解怎么去实现屏幕适配。敬请大家关注屏幕适配篇(二)

3 0
原创粉丝点击