每个Android 程序员 都会遇到的一个问题 那就是手机适配
现在呢,Android出现了很多种分辨率的手机 我们就必须得考虑到各种分辨率的手机适配,这个对于程序员来说也是一个麻烦
现在市场上面的手机呢我们适配多数 分辨率的就行了,主流的分辨率是 480x320 ,800x480 ,1280x720 ,1920x1080,前面两种分辨率的手机现在已经很难看到了。
现在的适配主要针对 文字,控件,图片三种来做适配,要想适配做的好,就必须了解设置他们大小的单位也就是 px,dp,sp他们三个之间的区别与关系。
那我们就来简单的解释一下
px,这个容易理解 就是一个像素就叫px
dp,一个取决于手机像素密度(dpi)的抽象单位,通俗点就是会根据每个手机不同的像素密度而建立不同的大小,而每个手机的像素密度是不一样的,所以dp是一个Android专有的一个用于适配的单位,它与px的关系
dp = px / density(像素密度) + 0.5f 注意每个手机的像素密度都是不固定的
而手机的像素密度可以通过 getResources().getDisplayMetrics().density 这句代码得到,所以我们说dp是一个Android专有的一个用于适配的单位,只要你在布局中使用了dp就已经做好了适配。
当然如果设计师们问你做多大的图 你千万不要跟别人说做 多少dp的图片,因为或许他们都没听过什么是dp
sp,sp和dp类似,但是唯一不同的是sp会根据用户的字体大小偏好来缩放(建议使用sp作为文本的单位,其它用dp)
顺便说一下Android 各种单位的互换
/**
* 根据手机的分辨率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);
}
public static float sp2px(Context context, float sp){
final float scale = context.getResources().getDisplayMetrics().scaledDensity;
return sp * scale;
}
下面我们实际来证明一下 我们用三个布局 分别设置dp,sp,px为单位,布局文件为
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<TextView
android:layout_width="100dp"
android:layout_height="100dp"
android:background="@color/colorAccent"
android:gravity="center"
android:text="100dp"
android:textSize="18dp"/>
<TextView
android:layout_width="100sp"
android:layout_height="100sp"
android:background="@color/colorFive"
android:gravity="center"
android:text="100sp"
android:textSize="18sp"/>
<TextView
android:layout_width="100px"
android:layout_height="100px"
android:background="@color/colorFour"
android:gravity="center"
android:text="100px"
android:textSize="18px"/>
</LinearLayout>
在480*800的分辨率上运行效果为
在1080*1920的分辨率上运行效果为
从上面的运行效果来看 我可以看出设置px的控件 在大分辨率手机上变小了,而我们设置dp和sp的无论是字体还是控件本身的大小都变化不大,上面我们已经说了,基本上设置了dp,sp就相当于做好了适配,dp,sp是会根据手机不同的像素密度而改变大小的,它们在不同的手机上面转化为px之后的大小是不一样的 比如:
在1920的分辨率我们设置100dp或者sp 转化为px之后的大小是300px,那么我们在1280的手机上同样设置100dp或者sp 转化为px之后的值就有可能是200了。(当然具体的值是根据手机像素密度而定的)
所以当我们在编码的时候 文字尽量就用sp,而其他的大小就用dp,这样可以省去了不少的麻烦。
接下来我们改如何适配图片的大小呢
我们都知道在我们拿到图片的时候,图片的大小已经固定了 一张100*100的图片你拿到哪里都是100*100,因为人家作图的时候就已经按照这个分辨率去做的,当然如果你要强制性放大,缩小也不是不可以,只不过这样的图片就可能失真了,这个不是我们想要的结果
所以我们Android工程目录里面就出现了一串用于适配图片的文件夹
drawable-ldpi: 屏幕密度为120的手机设备 240x320
drawable-mdpi: 屏幕密度为160的手机设备 320x480(此为baseline,其他均以此为基准,在此设备上,1dp = 1px)
drawable-hdpi: 屏幕密度为240的手机设备 480x800、480x854
drawable-xhdpi: 屏幕密度为320的手机设备 至少960*720
drawable-xxhdpi:屏幕密度为480的手机设备 1280×720
千万不要把 图片放到不对应的文件夹里面,因为Android 系统会默认在找不到对应文件夹下面图片的情况下,去最接近当前分辨率的文件夹里面拿相应的图片,这个时候系统会默认的对拿到的图片进行伸缩的。这个时候往往就得不到我们想要的效果(当然你就需要这种效果除外)
所以我们适配图片的话 只需要拿到市场上主流分辨率的几套图片就行了,然后放在对应的文件夹里面就行了,当然图片越多就会增加手机安装包的大小,这个就看你怎么去调节这个东西了
以上都是自己总结的东西,如有问题,欢迎指正。