您的位置:首页 > 移动开发 > Android开发

Android屏幕适配篇(一)

2016-03-06 23:22 447 查看
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>


效果图:



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



那么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>


效果图:



结论:子控件的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>


效果图:



结论:假设每个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。

理解清楚了一些基本概念,下篇我会讲解怎么去实现屏幕适配。敬请大家关注屏幕适配篇(二)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: