关于屏幕适配的理解

来源:互联网 发布:windows连接git服务器 编辑:程序博客网 时间:2024/05/29 18:35

做个记录

主要是有关drawable-mdpi,drawable-hdpi,drawable-xhdpi等等以及layout-1024x720,layout-1024x552,layout-1280x720等还有layout-mdpi,layout-hdpi,layout-xhdpi等的理解和应用,当然还有dp,dpi,sp,px的转化

想要知道怎么运用就要先知道dp,sp,px代表的意思

px:像素

dp/dip:独立像素,长度单位

sp:长度单位,一般用来设置字体大小

dpi:每英寸的点数,即每英寸所包含的像素个数

density:屏幕密度,其中density=dpi/160

Android Drawable

我们新建一个Android项目后应该可以看到很多drawable文件夹,分别对应不同的dpi

  • drawable-ldpi (dpi=120, density=0.75)

  • drawable-mdpi (dpi=160, density=1)

  • drawable-hdpi (dpi=240, density=1.5)

  • drawable-xhdpi (dpi=320, density=2)

  • drawable-xxhdpi (dpi=480, density=3)

除此之外还要先知道自己设备是属于上面的哪个属性,可运行下面的代码获取相关信息:

        Resources resources = this.getResources();        DisplayMetrics dm = resources.getDisplayMetrics();        float density = dm.density;//密度        int width = dm.widthPixels;//分辨率:像素        int height = dm.heightPixels;//分辨率:像素        int screenWidth = (int)(width/density);//屏幕的宽度:dp        int screenHeight = (int)(height/density);//屏幕高度:dp
得到density之后,就可以知道自己的设备需要适配哪个属性的了,假设你只在drawable_xhdpi文件夹下放了test图片,xhdpi的设备会去xhdpi文件夹下找到test图片并直接显示,而mdpi的设备优先会去mdpi文件夹里查找test图片,但是没找到,最后在xhdpi文件夹下找到,然后会自动根据density计算并缩放显示出来,实际显示出来的大小是120/2=60px,反而如果在mdpi文件夹中找到了120*120的图片,那么显示出来的大小就是120/1=120px,综上所述,如果我们在mdpi文件夹和xhdpi文件夹中都放入一张120*120的图片,那么在mdpi中找到的图片显示会偏大,所以在屏幕适配的时候,如果想要保持效果比例一致,在不同文件夹的图片一般都会有对应大小的图片,但很多情况下,有时候只会提供一张图片,一般这种情况我们是首选将图片放入xhdpi文件夹(前两年都是这样,主要是依据当时主流手机设备的分辨率有关),现在大部分手机都是1920*1080(480dpi)的,这个选择可以根据自己情况而定,像电视TV测试屏幕很多是1920*1080(横版,240dpi)的。
layout-mdpi这些跟上面drawable的一样

下面是一个转化的工具类(网上找的)

package com.zhy.utils;import android.content.Context;import android.util.TypedValue;/** * 常用单位转换的辅助类 *  *  *  */public class DensityUtils{private DensityUtils(){/* cannot be instantiated */throw new UnsupportedOperationException("cannot be instantiated");}/** * dp转px *  * @param context * @param val * @return */public static int dp2px(Context context, float dpVal){return (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP,dpVal, context.getResources().getDisplayMetrics());}/** * sp转px *  * @param context * @param val * @return */public static int sp2px(Context context, float spVal){return (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_SP,spVal, context.getResources().getDisplayMetrics());}/** * px转dp *  * @param context * @param pxVal * @return */public static float px2dp(Context context, float pxVal){final float scale = context.getResources().getDisplayMetrics().density;return (pxVal / scale);}/** * px转sp *  * @param fontScale * @param pxVal * @return */public static float px2sp(Context context, float pxVal){return (pxVal / context.getResources().getDisplayMetrics().scaledDensity);}}


参考资料:

http://blog.csdn.net/fumeidonga/article/details/50999977

http://blog.csdn.net/icewst/article/details/38685319

待完善...