Android 手机适配其实也简单

    每个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 系统会默认在找不到对应文件夹下面图片的情况下,去最接近当前分辨率的文件夹里面拿相应的图片,这个时候系统会默认的对拿到的图片进行伸缩的。这个时候往往就得不到我们想要的效果(当然你就需要这种效果除外)

所以我们适配图片的话 只需要拿到市场上主流分辨率的几套图片就行了,然后放在对应的文件夹里面就行了,当然图片越多就会增加手机安装包的大小,这个就看你怎么去调节这个东西了


以上都是自己总结的东西,如有问题,欢迎指正。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值