做个记录
主要是有关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
待完善...